[ruby-list:50482] Re: [質問] define_method の使い方
From:
<yamataka@...08.itscom.net>
Date:
2017-02-07 10:53:19 UTC
List:
ruby-list #50482
山口です。
> 市田です。
いつもご教示ありがとうございます。
> define_method のレシーバが何かを考えると、nilに
> なるのと、define_method がうまくいかないのとが
> 理解できるのではと思います。
理解が今一つおよばないですが...
> @api_name_list はどちらもインスタンス変数ですが、
> それぞれ別のものを指しています。
> 最初のものはIkaオブジェクトのインスタンス変数を、
> 後者はIkaクラスオブジェクトのインスタンス変数を
> 参照するという違いがあるので、別もののため、nil
> になります。
class Tako と class Ika での実行結果から、
なんとなく違うものなんだろうなと思っていました。
このご説明と、
> そもそも define_method が呼ばれる「クラスの定義を
> 実行している」ときには、まだ initialize は呼ばれて
> いないというのもあります。
このご説明で、理解が深まりました。
> このあたりは『メタプログラミングRuby』が参考になります。
購入して、今勉強中です。
結局、method_missing を用いることで、似たような method の定義
対応にしました。
class Uni
def initialize
@api_name_list = self.getSupportedApiInfo
end
def method_missing(apiname,*args)
if @api_name_list.include?(apiname.to_s) then
puts "#{apiname}"
# Uniインスタンスから support している method がよばれたら... もろ
もろの処理
else
puts "[ERROR] #{self.class.name}: #{api_name} is not in
getSupportedApiInfo!"
end
end
def getSupportedApiInfo
Array['setPowerSettings','getStorageList'] # 実際にはネットワーク上
の機器に問い合わせて apiのリスト取得
end
end
Uni.new.setPowerSettings