aliasとalias_methodの続き:

http://d.hatena.ne.jp/rubyco/20060319/aliasより。

id:rubycoさんの実験によると、メソッドの中でaliasが使える模様。ということで、ちょっと実験してみた。

  def rubyco
    puts "rubyco"
  end
  
  def change(x)
    alias_method :walf443, :rubyco
  end
  #=> undefined method `alias_method' for main:Object

  def change(x)
    alias walf443 rubyco
  end
    
  walf443 #=> rubyco

ということで、マニュアルはalias_methodがメソッドの中で使えないというのが正しいみたいですね。すなわち、動的に処理をしたいならaliasを使わないといけないようです。また、attr_accessorみたいなClass(Module)の補助機能的なメソッドはModuleクラスにprivateで定義しておくとよいみたいです。

そこで、動的な名前をつけるメソッドを考えてみる。

class SomeClass
  alias_method :walf443, :rubyco
  def rubyco
    puts "rubyco"
  end
  def change(x)
    alias x rubyco
  end
end

obj = SomeClass.new
obj.rubyco #=> rubyco
obj.walf443 #=> rubyco
obj.change :hoge
obj.hoge #=> undefined method `hoge' for #<SomeClass:0x40317280>

とのことで、aliasに変数は渡せないらしい。となると、結局動的な名前をつけるためにはevalを使わないとならないので、それならclass_evalでalias_methodを使えばいいじゃんという話になる気がする。。。