山口です。

> 市田です。

いつもご教示ありがとうございます。

> 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