Techioz Blog

インスタンスメソッド内で最上位の「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 のトップレベルを扱うときに、なぜ一部のものが機能し、一部が機能しないのかを理解するのに役立ちます。