インスタンスメソッド内で最上位の「main」を参照することはできますか?
概要
メインオブジェクトをモジュールで拡張した場合、別のオブジェクトの新しいメソッドを参照することはできますか?
module Mod
def meth
puts "top level"
end
end
extend Mod # --- not include
class My
def meth
puts "instance"
TOP_LEVEL.meth # --- psuedo-code to explain the intention
end
end
My.new.meth # prints "instance", then fails
解決策
これは、ユーザー定義のグローバル変数を必要とせずに機能します。
class My
def meth
puts "instance"
TOPLEVEL_BINDING.receiver.meth
end
end
代替の TOPLEVEL_BINDING.eval(‘meth’) も meth を直接呼び出すことによって機能しますが、非自明なメソッドの場合は、レシーバー メソッドを介して返される「メイン」オブジェクトへのハンドルの方がおそらく便利です。
余談ですが、このブログ投稿は、Ruby のトップレベルを扱うときに、なぜ一部のものが機能し、一部が機能しないのかを理解するのに役立ちます。