繁体   English   中英

Perl中的 - >和::有什么区别

[英]What is the difference between -> and :: in Perl

Perl中::->之间的确切区别是什么?

->有时工作的地方::不。

::有两个用途。

  1. 它是包名称中的命名空间分隔符

     use Foo::Bar; # Load Foo/Bar.pm $Foo::Bar::var # $var in namespace Foo::Bar 
  2. 附加到一个裸字,它创建一个字符串文字[1]

    以下内容与'hello'相同,只是如果包hello不存在则会发出警告:

     hello:: 

->有两个用途。

  1. 它用于解除引用。

     $array_ref->[$i] $hash_ref->{$k} $code_ref->(@args) 
  2. 它在方法调用中用于表示调用者。

     CGI->new() # Static method call $cgi->param() # Object method call 

你可能会问它们之间有什么区别

Foo::Bar::mysub()

Foo::Bar->mysub()

前者是函数调用。 后者是方法调用。 方法调用就像一个函数调用,有两个不同之处:

  1. 方法调用使用继承。

  2. 方法调用将调用者( ->的左边)作为第一个参数传递给sub。

{
   package Foo::Baz;
   sub new {
      my ($class, $arg) = @_;
      my $self = bless({}, $class);
      $self->{arg} = $arg;
      return $self;
   }

   sub mysub1 {
      my ($self) = @_;
      print($self->{arg}, "\n");
   }
}

{
   package Foo::Bar;
   our @ISA = 'Foo::Baz'; 
   sub mysub2 {
      my ($self) = @_;
      print(uc($self->{arg}), "\n");
   }
}

my $o = Foo::Bar->new('hi');  # Same as: my $o = Foo::Baz::new('Foo::Bar', 'hi');
$o->mysub1();                 # Same as: Foo::Baz::mysub1($o);
$o->mysub2();                 # Same as: Foo::Bar::mysub2($o);

笔记

  1. Foo->method欺骗性地调用名为Foo的子(如果它存在)(使用它作为调用者返回的值)。 Foo::->method ,意思是'Foo'->method ,没有。

当右侧是函数时->将其左侧作为函数的第一个参数传递。 所以下面的例子是等价的,如果$foo是一个包装Foo的对象,而Bar在包Foo中。 ->将解析继承的方法,使其更清晰,对对象更有用。

$foo->Bar();

Foo::Bar($foo);

->也可以带包名

Foo->Bar();

Foo::Bar('Foo');

这意味着->通常在实例方法中使用,以便对象传递其自身和构造函数,以便构造函数知道要使用哪个包。 这通常是一个参数,因此可以继承。

这里有很多解释,但这里是新开发人员非常简单的答案:

FOO::BAR();  # is calling the class's (aka. package's) default object
$FOO->BAR(); # is calling an initiated object

对象通常具有经常设置的属性,而未初始化的对象仅使用默认对象属性。

假设FOO有一个名为'Age'的属性,其默认值为1,我们可以通过程序中较早的set命令进行更改。 然后,我们决定再次调用包,以获得我们可以看到的乐趣:

use FOO;
$FOO = new FOO(); #new instance of foo 
$FOO->SetAge(21);

# more code here

print $FOO->GetAge(); # prints 21
print FOO::GetAge(); # prints 1

没有任何存储变量的包怎么样? 在许多情况下,可能没有任何区别,但这最终取决于课程的编写方式。 最后它比那更复杂..这不是真正的答案,但我认为你正在根据你的问题寻找。

为了防止混淆,我通常在创建对象时不使用类/包名称。 如果由于某种原因我不知道该怎么称呼它我在它前面添加一个'o',所以很明显它是一个对象而不是一个类,这对任何编程语言都是一个好习惯。

即使用

$oFOO = new FOO(); // new object instance of foo

希望有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM