簡體   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