$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)
- 1. Literal bir noktaya sahip bir Perl hash anahtarını nasıl kullanabilirim?
- 2. Nasıl perl regex kullanarak bir dizede dolar işareti ($) kaçış
- 3. Uzantı adını bash ile bir dizede nasıl değiştirebilirim?
- 4. Perl modülünde bir işlev referansı nasıl yazılır?
- 5. Perl Best Practice, bir dizede bir metod ismine sahip mi?
- 6. Regex: bir dizede son noktayı eşleştirmek nasıl
- 7. Bir kodlama dilinden DLL'yi nasıl çağırabilirim?
- 8. Dinamik bir nesnede bir yöntemi dinamik olarak nasıl çağırabilirim?
- 9. ActionScript'te bir diziyle varargs işlevini nasıl çağırabilirim?
- 10. Alan adını bir işlev şablonuna aktarma
- 11. Model adını belirtmeden, o modelin bir örneğinden statik bir Backbone.Model işlevini nasıl çağırabilirim?
- 12. Nasıl dahil edilir "bir dizede
- 13. Bir Dizgeden Bir İşlev Çağrma İşlev Çağın İçinde Clojure ile
- 14. Perl: Perl bir karma değer
- 15. Düğme üzerindeki bir işlevi nasıl bir modda çağırabilirim?
- 16. Bir türle nasıl varsayılan (T) çağırabilirim?
- 17. Bir sorgu görevinden denetleyici eylemini nasıl çağırabilirim?
- 18. Jinja2'de bir makroyu nasıl çağırabilirim?
- 19. Python'da gecikmeli bir işlevi nasıl çağırabilirim?
- 20. Perl ile bir dosyanın adını nasıl alabilirim? Benim perl komut dosyasında
- 21. İç içe geçirilmiş bağımlılık yöntemlerini bir yönerge denetleyicisinden nasıl çağırabilirim?
- 22. Lua'da bir işlev verilen bir işlev var mı, adını bir dize olarak döndürüyor mu?
- 23. Perl'de, bir dizede sahip olduğum bir yöntemi nasıl arayabilirim?
- 24. Braket gösterimini kullanarak üye işlevini nasıl çağırabilirim?
- 25. android bir dizede belli charcater
- 26. Ruby'yi Node.js'den nasıl çağırabilirim?
- 27. Python, işlev kapatma işlevinin adını nasıl saklar?
- 28. Perl kod referansının alt yordam adını belirleme
- 29. Bir dizede satırların üzerinde yineleme?
- 30. Parametreli bir sorgunun parçası olarak bir oracle işlevini nasıl çağırabilirim?