【问题标题】:Difference between double colon and arrow in perlperl中双冒号和箭头的区别
【发布时间】:2019-12-23 21:36:39
【问题描述】:

如果是重复的,请说出来。我还没有找到它,仅适用于 PHP,但适用于 Perl。所以如果我能写出全名,例如Class::sub()$Class::scalar,我可以写Class->sub$Class->scalar(如果我有used 或required 和Class),perl 的主要区别是什么?

问题是: 类 Animal.pm:

#!/usr/bin/perl -w
package Animal;
our $VERSION = '0.01';
sub speak {
    my $class = shift;
    print "a $class goes ", $class->sound;
}
sub sound{
    die "You have to defined sound() in a subclass";
}

然后上课 Horse.pm:

#!/usr/bin/perl -w
package Horse;
use Animal;
our @ISA = qw[Animal];
our $VERSION = '0.01';
sub sound { 'neight' }
1

如果我在主程序中这样做:

#!/usr/bin/perl -w
BEGIN{ unshift @INC, 'dirWithModules' }
 use Horse; use Animal;use Cow;
Animal::speak('Horse');

输出---->"a Horse goes neight" 但是如果我 OD

#!/usr/bin/perl -w
BEGIN{ unshift @INC, 'dirWithModules' }
 use Horse; use Animal;use Cow;
Animal->speak('Horse')

输出--->"You have to defined sound() in a subclass at Animal.pm"

所以我的问题是,如果我从Animal.pmAnimal.pmHorse.pm 引用我的方法,使用::,双冒号,NO PROBLEM - 它会打印声音。但是,如果我尝试使用 -> 箭头引用 sub,$class 不会被继承 - 也就是说,$class 本身是 Animal.pm,但不是作为发送的参数 ('Horse')。那么::-> 有什么不同呢?

【问题讨论】:

  • 阅读官方文档是个好主意:perldoc.perl.org/perlmod.html
  • @MiguelPrz 文档对于初学者来说可能相当吓人。由于我有经验,我知道打开 perlop(找到->),这导致我进入 perlobj。知道答案的人说“rtfm”很容易,但初学者很难找到相关文档的位置/内容(尤其是在这种情况下,因为答案分为 perlmod 和 perobj)。
  • @dada 和 OP,一个很好的起点,perlobj 第一行提到的就是教程perlootut

标签: perl


【解决方案1】:

Foo->bar() 是一个方法调用。

  • 如有必要,它将使用继承。
  • 它将调用者(-> 的左侧)作为第一个参数传递。因此,bar 应该写成如下:

    # Class method (Foo->bar)
    sub bar {
       my ($class, ...) = @_;
    }
    

    # Object method (my $foo = Foo->new; $foo->bar)
    sub bar {
       my ($self, ...) = @_;
    }
    

Foo::bar() 是子调用。

  • 它不会使用继承。

【讨论】:

    猜你喜欢
    • 2011-03-11
    • 1970-01-01
    • 2013-10-19
    • 2012-01-02
    • 2010-10-30
    • 2021-01-17
    相关资源
    最近更新 更多