動的メソッド呼び出し(#send
または#method
)を使用すると、メソッドの可視性は無視されます。
プライベートメソッドの呼び出しに失敗するメソッドを動的に呼び出す簡単な方法はありますか?プライバシーを尊重しながら動的にメソッドを呼び出す方法
答えて
Object#public_method
あなた自身を書くことができ、あなた自身を記述する必要があり
私が知っているとおり、あなたはメソッドpublic_sendが必要です:
----------------------------------------------------- Object#public_send obj.public_send(symbol [, args...]) => obj From Ruby 1.9.1 ------------------------------------------------------------------------ Invokes the method identified by _symbol_, passing it any arguments specified. Unlike send, public_send calls public methods only. 1.public_send(:puts, "hello") # causes NoMethodError
私はあなたがそうしたい理由を理解していない、eval
を使用することができます。
class Klass
private
def private_method(arg)
end
end
k = Klass.new
m = "private_method"
eval "k.#{m}('an arg')"
NoMethodError: private method `private_method' called for #<Klass:0x128a7c0>
from (irb):15
from (irb):15
評価を本当に悪いです。 mが実際にメソッド名だけを含んでいるかどうかを事前に確認する必要があります。あなたがメソッド名のように見えるものを考えてアタッカーがあなたをだまそうとしますが、本当はそうではありません。 – johannes
ruby-1.9を使用している場合は、Object#public_send
を使用して必要な処理を実行できます。
あなたはルビー1.8.7またはそれ以前のバージョンを使用している場合は、Object#public_send
class Object
def public_send(name, *args)
unless public_methods.include?(name.to_s)
raise NoMethodError.new("undefined method `#{name}' for \"#{self.inspect}\":#{self.class}")
end
send(name, *args)
end
end
それとも、Object#method
だけのパブリックメソッドの
class Object
def public_method(name)
unless public_methods.include?(name.to_s)
raise NameError.new("undefined method `#{name}' for class `#{self.class}'")
end
method(name)
end
end
実際、evalは実際には私が実際にそれを行う唯一の方法は1.9と思っています。可視性についての詳細を知りたい場合Jamis BuckはRubyで実際に可視性がどのような方法であるかについてawesome articleと書いています。
Rubyの可視性の他のものと同様に、他の言語とほとんど変わりません。
利用代わりsend
のpublic_send
:
my_object.public_send :method, *args
それは、Ruby 1.9の新しいだ古いルビー、あなたができるrequire 'backports/1.9.1/kernel/public_send'
ためそう。
あなたはeval
、send
またはpublic_send
を避けたい、またはあなたがbetter performanceをしたい場合は、public_method
methodを使用します。
obj.public_method('my_method_name').call
あなたはこのような引数を追加することができます。
obj.public_method('my_method_name').call('some_argument_1', 'some_argument_2')
- 1. 静的メソッドの多重呼び出し
- 2. Gradleから静的なJavaメソッドを呼び出す方法
- 3. .NETでクラスのメソッドを動的に呼び出す方法
- 4. リモートオブジェクトとメソッドを動的に呼び出す方法
- 5. Laravelのルートでメソッドを動的に呼び出す方法は?
- 6. C#でメソッド/呼び出しを別のメソッドから呼び出す方法は?
- 7. 具体的なクラスのメソッド呼び出しを呼び出す
- 8. 動的なモジュールのリストからメソッドを呼び出す
- 9. 動的メソッド呼び出しの作成方法
- 10. aspxから非静的メソッドを呼び出す方法
- 11. SecondActivityからMainActivityで非静的メソッドを呼び出す方法
- 12. サブクラス静的メソッドからジェネリックメソッドを呼び出す方法
- 13. Activityから非静的メソッドを呼び出す方法は?
- 14. ジェネリッククラスから静的メソッドを呼び出す方法は?
- 15. 静的メソッドからstartActivityForResultを呼び出す方法は?
- 16. 動的メソッドの呼び出し?
- 17. JVMの動的メソッド呼び出しトレースログイン
- 18. OOPの動的メソッド呼び出し
- 19. Objective-Cの動的メソッド呼び出し
- 20. groovyのコマンドライン引数から動的にメソッドを呼び出す
- 21. 未知のクラスから自動的にメソッドを呼び出す
- 22. キーで特定のメソッドを呼び出す最も効率的な方法|| refactorメソッド呼び出しswitch文
- 23. 各api呼び出しの前に自動的にapi呼び出しを呼び出す方法
- 24. Subを別のSubから動的に呼び出す方法
- 25. backgroundworkerからテキストボックスを自動的に呼び出す方法は?
- 26. Pythonでクラスと呼び出しメソッドを動的にロードする方法は?
- 27. 他のオブジェクトからメソッドを呼び出すメソッド呼び出し
- 28. インスタンスを介して静的メソッド内で静的メソッドを呼び出す方法
- 29. JavaScript/ES7クラスで静的メソッドを動的に呼び出し
- 30. 自動的にスレッドを停止するメソッドを呼び出す方法は?
これはruby 1.8.7では利用できません – johannes
実際には、私は信じて1.9で十分です。噂は1.9で心配していますが、__send__は心配していません。しかし、私はこれを確認していない。 –