2016-01-12 28 views
6

私は動的に現在のメソッドが定義されたクラスを決定したいと思いますメソッドが定義されたクラスを決定する方法は?

をここで私は何をしようとしているの静的な例です:。

class A 
    def foo 
    puts "I was defined in A" 
    end 
end 

class B < A 
    def foo 
    puts "I was defined in B" 
    super 
    end 
end 

A.new.foo 
# I was defined in A 

B.new.foo 
# I was defined in B 
# I was defined in A <- this is the tricky one 

どのように私はABを置き換えることができます上記の文字列は動的な式で?

明らかに、#{self.class}は機能しません。私は答えは「あなたがすることができない」、多分私が何かを見下ろすよであることを疑う

(それはBために二回I was defined in Bを印刷します)。

+1

それのすべて:) – ndn

+1

私は__class__' 'を期待していた@ndnへの鍵、それは存在しません。 。 – Stefan

+1

なぜそれを知る必要がありますか? –

答えて

4

これはどうですか?

class A 
    def foo 
    puts "I was defined in #{Module.nesting.first}" 
    end 
end 

class B < A 
    def foo 
    puts "I was defined in #{Module.nesting.first}" 
    super 
    end 
end 

WandMakerの提案に従って修正されました。

+1

'Module.nesting'が問題を解決し、sawaが最初に投稿したので、私はこの答えを選択しました。しかし、それは私が取り組んでいた実際の問題を解決しないので、私は[フォローアップの質問](http://stackoverflow.com/q/34745608/477037)を投稿しました。 – Stefan

3

Module.nesting.firstを使用できます。

しかし、これは、同じように定数の解像度が働くので、あなたは、よりダイナミックなニーズがあれば、それはそれをカットしないであろう、辞書的に純粋に動作することに注意してください:

Foo = Class.new do 
    def foo 
    Module.nesting 
    end 
end 

Foo.new.foo # => [] 
+0

ネストされたモジュールの場合、正しい答えが得られないことがあります。本当にOPに必要なもの(クラス名またはモジュール名)に依存します。 –

+3

'モジュールA 'を'モジュールC'の中で定義しようとします。 'Module.nesting.last'を使うとメソッドが' C'で定義されたと言います。 1つは 'Module.nesting.first'を使用する必要があります –

3

を、私はこのしつこい感覚を持っているあなたができればそのこれは、オブジェクト指向のカプセル化に違反しますが、なぜ私の指が正確にその理由に置かれることはありません。だから、それは驚くべきことではありません、それは難しいです。

あなたがメソッドの定義を変更するに開いている場合、私は道を見ることができます:

class A 
    this = self 
    define_method(:foo) do 
    puts "I was defined in #{this}" 
    end 
end 

class B < A 
    this = self 
    define_method(:foo) do 
    puts "I was defined in #{this}" 
    super() 
    end 
end 

A.new.foo 
# I was defined in A 

B.new.foo 
# I was defined in B 
# I was defined in A 
+0

いいですが、いくつかの動的なケースではまだ動作しません。クラスの外部からクラスのメソッドを定義すること。 (: – ndn

+0

私の理解では、 'Module.nesting'は語彙的に動作するいくつかのメソッド/キーワードの中にあります(つまり、動作はソースコードの場所に依存します)ので、メソッドからメソッドに直接渡すことはできません。変数として渡すことができます。これらは 'binding'、' __FILE__'、 '__LINE__'、' __dir__'、 'Module.nesting'などです。 – sawa

+1

@sawa' __method__'はもう一つです。 – Stefan

関連する問題