【问题标题】:How do you create objects in Perl?你如何在 Perl 中创建对象?
【发布时间】:2010-09-05 16:37:01
【问题描述】:

Perl 具有 OOP 功能,但它们很少使用。如何创建和使用带有方法和属性的 Perl 对象?

【问题讨论】:

    标签: perl oop syntax


    【解决方案1】:

    你一定要看看Moose

    package Point;
    use Moose; # automatically turns on strict and warnings
    
    has 'x' => (is => 'rw', isa => 'Int');
    has 'y' => (is => 'rw', isa => 'Int');
    
    sub clear {
        my $self = shift;
        $self->x(0);
        $self->y(0);
    }
    

    Moose 免费为您提供(除其他外)构造函数、访问器方法和类型检查!

    所以在你的代码中你可以:

    my $p = Point->new({x=>10 , y=>20}); # Free constructor
    $p->x(15);     # Free setter
    print $p->x(); # Free getter
    $p->clear();
    $p->x(15.5);   # FAILS! Free type check.
    

    一个好的起点是Moose::ManualMoose::Cookbook

    如果你只需要基本的东西,你也可以使用Mouse,它并不完整,但没有大部分编译时间损失。

    【讨论】:

    • 如果您只需要 Moose 的简单功能,也可以使用鼠标
    • 对于 Moose 的新手有什么好的教程吗?谢谢
    • @Alexandr,谢谢更新了答案。 @melaos 我已经编辑了答案以提供链接
    • 清理了部分markdown链接,将Moose::Intro改为Moose::Cookbook
    • 我在 Catalyzed.org 上看到的关于 Moose 的最佳介绍:catalyzed.org/2009/06/a-gentle-introduction-to-moose.html 即使作为一名经验丰富的 Perl 程序员,我也有一段时间避免使用 Moose,因为它看起来很混乱。
    【解决方案2】:

    Moose,肯定的。

    package Person;
    use Moose;
    has age => ( isa => Int, is => 'rw'); 
    has name => ( isa => Str, is => 'rw'); 
    1;
    

    马上,你就有了一个免费的 new() 方法,以及你刚刚用 'has' 定义的属性的访问器方法。所以,你可以说:

    my $person = Person->new();
    $person->age(34);
    $person->name('Mike');
    print $person->name, "\n";
    

    等等。不仅如此,您的访问器方法还可以免费进行类型检查(您可以定义自己的类型以及标准类型)。此外,您还可以获得用于子类化的 'extends'、用于角色/特征的 'with' 以及各种其他很棒的东西,让您可以继续编写良好的、健壮的、可维护的 OO 代码。

    TMTOWTDI,但这个有效。

    【讨论】:

      【解决方案3】:

      目前,每当我想要对象时,我都会使用Object::InsideOut,它非常好,并且会为您提供比标准祝福哈希对象更多的功能。话虽如此,如果我开始一个新项目,我会认真考虑 Moose。

      虽然阅读官方 PERL 文档很好,但我建议尝试扮演您自己的对象框架,或使用哈希构建对象,这很容易让人走上轻松的道路,并且“ peak”直接插入对象的“私有”变量中,完全打破封装,当你想重构对象时,这会回来咬你。

      【讨论】:

        【解决方案4】:

        Perl 对象不仅仅是有福的散列。他们是有福的参考。它们可以(并且通常是)有福的哈希引用,但它们也可以很容易地成为有福的标量或数组引用。

        【讨论】:

          【解决方案5】:

          CPAN site上的官方教程不错。

          CodeProject 上还有一篇名为Camel POOP 的好文章。

          【讨论】:

          • 请注意,如果您有正常的 Perl 安装,所有 perldoc 教程也可以在命令行中使用:perldoc perltoot 就可以了。 (有关 Perl 中对象的更多乐趣,另请参阅 perldoc perlboot。)
          【解决方案6】:

          如果您想在 Perl 中进行 OO,我强烈建议您看看 Moose。但是,如果您不了解 Perl 中的 OO 是什么意思,它就不是很有用。为了更好地理解 Perl OO 的工作原理,我在我的博客上写了一个概述:http://augustinalareina.wordpress.com/2010/06/06/an-introduction-to-object-oriented-perl/

          从数据结构的角度来看,对象是具有一些额外功能的引用。解释器知道将这些特殊引用视为对象,因为它们已被关键字“bless”“祝福”。 Blessed 引用包含一个标志,表明它们是一个对象。本质上,这意味着您可以在它们上定义和调用方法。

          例如,如果您创建了一个基本的 hashref,这将不起作用: $hashref->foo();

          但是,如果您创建一个祝福的 hashref(又名对象),这确实有效: $blessed_hashref->foo();

          Moose 是 Perl 中用于 OOP 的优秀模块,因为它创建了一个可执行的 OO 层并自动处理访问器方法,因此您不必定义一堆 getter 和 setter。如果您有兴趣使用 Devel::Peak 查看 Perl 解释器如何存储对象,请点击我在上面发布的博客条目的链接。

          【讨论】:

            【解决方案7】:

            一方面,每个类都是一个包;您通过设置包变量@ISA(最好在编译时)来建立(如果需要,多个)继承;您使用bless(REFERENCE [, CLASSNAME]) 从现有数据(通常但不总是用于存储实例变量的匿名哈希)创建一个对象;您可以调用 $obj->methodname(@ARGS) 之类的对象方法和“CLASSNAME”->methodname(@ARGS) 之类的类方法。 可以使用mro 更改多重继承方法解析顺序。

            因为这有点简约并且不强制封装,所以有许多不同的模块可以提供更多或不同的功能。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-03-25
              • 2014-07-28
              • 1970-01-01
              • 1970-01-01
              • 2013-07-16
              • 1970-01-01
              • 2014-03-21
              相关资源
              最近更新 更多