|
|
||
publicだけでなく、protectedやprivateなメソッドも呼び出せる
オーバーライドされた時用に、同義語として__send__が定義されている。削除したり再定義すると警告が表示される。
束縛情報のないMethodオブジェクト。メソッドを利用するためには、オブジェクトに束縛してMethodオブジェクトにしてからcallする必要がある。
unbound_plus = Fixnum.instance_method("+")
上記のようにして取得。
plus_2 = unbound_plus.bind(2)
上記のようにして束縛。
plus_2.call(2) #=> 4
上記のようにしてメソッドを起動する。
plus_3 = plus_2.unbind.bind(3)
Methodクラスのunbindメソッドを使ってもUnboudMethodオブジェクトを取得できる。
Procがブロックをオブジェクトにしたようなものだとしたら、Methodはメソッドをオブジェクトにしたようなもの。
o.method(:succ)
のようにして生成する。両者はほぼ同じ(callメソッドで呼び出せる)機能を持っており、両者間の変換もできるが、クロージャの有無が異なる。Methodはクロージャではない。
o.methods # publicメソッドの名前を返す o.public_methods # methodsと同じ o.public_methods(false) # 継承したメソッドを除外 o.protected_methods o.private_methods o.private_methods(false) # 継承したメソッドを除外 o.singleton_methods # 特異メソッドの名前を返す Object.instance_methods Object.instance_mehtods(false) Object.public_instance_methods Object.protected_instance_methods Object.private_instance_methods(false) Object.singleton_methods # クラスメソッドの名前を返す Object.public_method_defined? :hoge Object.protected_method_defined? :hoge Object.private_method_defined? :hoge Object.method_defined? :hoge # protectedかpublicなメソッドであればtrue
1.8では文字列配列、1.9ではシンボル配列が返る
これも名前の通り
o.instance_variable_set(:@x, 0) o.instance_variable_get(:@x) o.instance_variable_defined?(:@x) Object.class_variable_set(:@@x, 1) # ruby1.8だとprivate Object.class_variable_get(:@@x) # ruby1.8だとprivate Object.class_variable_defined?(:@@x) # ruby1.9以降 Object.const_set(:HOGE, "hoge") Object.const_get(:HOGE) Object.const_defined?(:HOGE)
class_variable_set, class_variable_getはruby1.8だとprivateなので
Object.class_eval do class_variable_get(:@@x) end
のような感じで使う。
ローカル変数やグローバル変数用のメソッドはないのでevalで代用する。
Object#instance_execはObject#instance_evalにブロック引数が渡せるやつ。
http://d.hatena.ne.jp/rubikitch/20080507/1210149729
ブロック引数を渡せるとうれしい場面ってどんなだろうなー
レシーバオブジェクトが、第一引数で指定された名前のpublic, protectedメソッドを持つかどうかを判定する。第二引数にtrueを指定すると、privateメソッドもチェックする