Perl中::
和->
之间的确切区别是什么?
->
有时适用于::
没有的地方。
答案 0 :(得分:52)
::
有两种用途。
这是包名称中的命名空间分隔符
use Foo::Bar; # Load Foo/Bar.pm
$Foo::Bar::var # $var in namespace Foo::Bar
附加到一个裸字,它会创建一个字符串文字 [1] 。
以下内容与'hello'
相同,但如果包hello
不存在则会发出警告:
hello::
->
有两种用途。
用于解除引用。
$array_ref->[$i]
$hash_ref->{$k}
$code_ref->(@args)
它在方法调用中用于表示调用者。
CGI->new() # Static method call
$cgi->param() # Object method call
你可能会问
之间有什么区别Foo::Bar::mysub()
和
Foo::Bar->mysub()
前者是函数调用。后者是方法调用。方法调用就像一个有两个不同的函数调用:
方法调用使用继承。
方法调用将调用者(->
的左侧)作为第一个参数传递给子。
{
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);
注释
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
希望有所帮助。