$name='name'
の場合$object_ref->$name
はなぜ機能しますか?$object_ref->('name')
はありません。Perlでリテラル文字列に定義された関数名を呼び出す方法はありますか?
5
A
答えて
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.
1
メソッド呼び出しの構文は$object->method
または$object->$method
です。ただし、与えた構文は$sub_ref->(@param)
に使用できます。
9
Perlでは、記号->
は2つの意味を持ちます。ベアワード$obj->name
またはスカラー$obj->$name
が続く場合、->
はメソッド呼び出しを意味します。
代わり->
が開口ブレースが続いている場合、それは以下の表によれば、間接参照である:->
値を逆参照されると
$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は価値があるかどうかをチェックしますブレースによって示された型のいずれか、またはオーバーロードを介してその型に強制することができます。あなたの例の->(
は、perlが$object_ref
をコードリファレンスに変換しようとしていることを意味し、おそらく失敗してエラーを投げます。
->
は、メソッド呼び出しであれば、perlのようなものが行われます。ただ、物事をより明確にするために
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"}
を:
sub foo {"foo(@_)"}
my $foo = \&foo;
say foo 'bar'; # 'foo(bar)'
say $foo->('bar'); # 'foo(bar)'
say 'bar'->$foo; # 'foo(bar)'
と
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. 文字列変数で関数名またはオブジェクト名を呼び出す方法はありますか? actionscript3
- 2. 定義された関数を呼び出す方法は? (Javascript)
- 3. フォームで定義された関数を別のフォームから呼び出す方法はありますか?
- 4. if文からユーザ定義関数を呼び出す方法
- 5. 名前でXSLTユーザー定義関数を呼び出す方法はありますか?
- 6. スクリプトタグで定義されたjavascript関数を呼び出す方法は?
- 7. 文字列からanonymus関数を呼び出す方法
- 8. Windowオブジェクトの文字列名から関数を呼び出す
- 9. JNDをVB.netに呼び出す方法ByRef文字列関数
- 10. 関数型インターフェイスで定義された呼び出し関数
- 11. あらかじめ定義された文字列でシェルを呼び出すのは安全ですか?
- 12. hieraにリテラル文字列 '%{:: fqdn}'を出力する方法はありますか?
- 13. 定義時に匿名関数が呼び出されますか?
- 14. 同じ署名の複数のモジュールで定義された関数を動的に呼び出す方法
- 15. スキルが呼び出されるたびにカスタムスキルの値を定義する方法はありますか?
- 16. 関数名を文字列として渡したときにネストされた関数を呼び出す
- 17. Jenkinsfileで関数を定義して呼び出す方法は?
- 18. Spacemacsで関数を定義して呼び出す方法は?
- 19. Pythonで格納された文字列から関数を呼び出す
- 20. 関数を呼び出す方法は、別の関数で定義されていますか?
- 21. Java:文字列変数に名前が格納されている関数を呼び出す方法
- 22. 関数を文字列として呼び出す方法はありますか?
- 23. 関数名を文字列として呼び出す
- 24. pysparkでspark SQLクエリからユーザ定義関数を呼び出す方法はありますか?
- 25. 文字列名の$(document).ready関数でjavacript関数を呼び出す
- 26. jQueryから既に定義された.onClick()関数を呼び出します。
- 27. 別のjavascriptファイルで定義されたクラス名でコールバック関数を呼び出す方法
- 28. 別の関数で定義された関数を呼び出す
- 29. perlで関数を呼び出す方法は?
- 30. 名前で指定されたオブジェクトのメソッドを文字列として呼び出す方法は?