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

时间:2013-10-27 18:28:55

标签: perl

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

->有时适用于::没有的地方。

3 个答案:

答案 0 :(得分:52)

::有两种用途。

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

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

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

    hello::
    
  3. ->有两种用途。

    1. 用于解除引用。

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

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

    3. 你可能会问

      之间有什么区别
      Foo::Bar::mysub()
      

      Foo::Bar->mysub()
      

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

      1. 方法调用使用继承。

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

      3. {
           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,不是。

答案 1 :(得分:6)

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

$foo->Bar();

Foo::Bar($foo);

->也可以采用包名称

Foo->Bar();

Foo::Bar('Foo');

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

答案 2 :(得分:-6)

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

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

希望有所帮助。