$name='name'
neden $object_ref->$name
çalışıyor, ancak $object_ref->('name')
çalışmıyor?Perl cinsinden bir literal dizede tanımlanmış bir işlev adını nasıl çağırabilirim?
cevap
$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
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.
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)