$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. スクリプトタグで定義されたjavascript関数を呼び出す方法は?
- 5. 文字列からanonymus関数を呼び出す方法
- 6. 同じ署名の複数のモジュールで定義された関数を動的に呼び出す方法
- 7. 関数名を文字列として渡したときにネストされた関数を呼び出す
- 8. Java:文字列変数に名前が格納されている関数を呼び出す方法
- 9. 関数名を文字列として呼び出す
- 10. 文字列名の$(document).ready関数でjavacript関数を呼び出す
- 11. jQueryから既に定義された.onClick()関数を呼び出します。
- 12. 別の関数で定義された関数を呼び出す
- 13. 別のjavascriptファイルで定義されたクラス名でコールバック関数を呼び出す方法
- 14. if文で呼び出されたときに文字列が関数で書き出されません。
- 15. ラムダ.NETでユーザ定義関数を呼び出す方法
- 16. Meteor Meteor.methods()で定義されたメソッドを呼び出す方法?
- 17. exeで定義された呼び出し関数
- 18. Jqtouchでユーザー定義jqueryまたはajax関数呼び出しを呼び出す方法
- 19. 呼び出すための関数名文字列にパラメータを入力する方法は?
- 20. ユーザー定義関数imacacsで関数を呼び出す方法は?
- 21. javascriptの文字列からプライベート関数を呼び出す方法は?
- 22. C++の文字列から特定の文字を呼び出す方法は?
- 23. jquery基本関数が呼び出されるたびに関数を呼び出す方法はありますか?
- 24. Pythonでクラスがロードされた後に関数を呼び出す方法はありますか?
- 25. 関数名の文字列からのlua呼び出し関数
- 26. CoffeeScriptで新しく定義された関数の関数を呼び出す方法
- 27. KRLクロージャー外からKRLで定義されたjavascript関数を呼び出す
- 28. P /呼び出された名前で関数を呼び出す
- 29. 文字列定数または文字列リテラルを使用する必要があります
- 30. ユーザー定義の文字列リテラル対。他のユーザー定義リテラル