2012-01-30 11 views

cevap

3
$obj->$name  # Method call with no args 
$obj->name  # Method call with no args 
$obj->$name()  # Method call with no args 
$obj->name()  # Method call with no args 

$sub->('name') # Sub call (via ref) with one arg. 
sub('name')  # Sub call with one arg. 

-> bir yöntem çağrısı ise, o perl böyle bir şey yapar

1

Yöntem çağrıları için sözdizimi $object->method veya $object->$method'dur. Ancak, verdiğiniz sözdizimi $sub_ref->(@param) için kullanılabilir.

9

Perl'de -> sembolü iki anlama sahiptir. Ardından, $obj->name veya bir skaler $obj->$name arşivi takip ederse, ->, yöntem çağrısı anlamına gelir. -> bir değer başvurusu kaldırma zaman

$obj->(...) # dereference as code, which calls the subroutine 
$obj->[...] # dereference as array, which accesses an element 
$obj->{...} # dereference as hash, which accesses an element 

, Perl değeri olup olmadığını görmek için kontrol eder: -> bir açıklık desteğin izlemektedir Bunun yerine

, o zaman, aşağıdaki tabloya göre, bir KQUEUE olan Ya da brace ile gösterilen tipte ya da aşırı yüklenme ile bu tipe zorlanabilirse. Yani, örneğinizdeki ->(, perl, $object_ref kodunu kod referansına dönüştürmeyi deneyecektir ve muhtemelen bir hata atmakla başarısız olacaktır.

if (reftype $name eq 'CODE') { # if $name is code, ignore $object_ref's type 
    $name->($object_ref)  # call the coderef in $name, with $object_ref 
}        # followed by any other arguments 

elsif (my $code = $object_ref->can($name)) { # otherwise, try to look up the 
    # coderef for the method named $name in $object_ref's namespace and then 
    $code->($object_ref) # call it with the object and any other arguments 
} 
else {die "no method $name on $object_ref"} 

Hemen şeyleri daha net yapmak için:

sub foo {"foo(@_)"} 

my $foo = \&foo; 

say foo 'bar';  # 'foo(bar)' 
say $foo->('bar'); # 'foo(bar)' 
say 'bar'->$foo; # 'foo(bar)' 

ve

sub Foo::bar {"Foo::bar(@_)"} 
my $obj = bless [] => 'Foo'; 

my $method = 'bar'; 

say $obj->bar(1);  # Foo::bar($obj, 1) 
say $obj->$method(1); # Foo::bar($obj, 1)