メソッドfを呼び出すクラスからクラス名を返す必要があります。どうすれば継承なしでそれを行うことができますか?そして...それは可能ですか?!
Ruby1.9.2を使用しています。
class B
def f
#need return class A
end
end
class A
attr_reader :a
def initialize()
@a = B.new
end
end
A.new.a.f #=> A
メソッドfを呼び出すクラスからクラス名を返す必要があります。どうすれば継承なしでそれを行うことができますか?そして...それは可能ですか?!
Ruby1.9.2を使用しています。
class B
def f
#need return class A
end
end
class A
attr_reader :a
def initialize()
@a = B.new
end
end
A.new.a.f #=> A
あなたはこのようなことをすることができます:
class B
def f
@blabla.class.name
end
def initialize(obj)
@blabla=obj
end
end
class A
attr_reader :a
def initialize()
@a = B.new(self)
end
end
A.new.a.f
=> "A"
バインディングを使用していることを除いて、davidrac のソリューションの代替バージョンです。バインディングについての知識が乏しく申し訳ありません。ここで間違って使用している可能性があります。誰か編集してください。thx. 私の場合、少なくともバインディングを渡す必要があります。
class B
def initialize(caller_class)
@caller_class = caller_class
end
def f
@caller_class
end
end
class A
attr_reader :a
def initialize()
@a = B.new(self.class)
end
end
puts A.new.a.f #=> A
これとは別に、次のものも利用できると思います。
set_trace_func lambda { |event, file, line, id, binding, classname| #do sth with classname }
またはダーティハックを試す
caller(0).last.match(/:(\d+):/)[1] # get the line number of caller, then get the class
ただし、A.new.af を 2 行に分けて呼び出すと、これは機能しません。
文字通り class を返すことをA
検討していますか、それとも呼び出し元のクラスを動的に決定しようとしていますか? 後者の場合、Ruby の内部に非常に奇妙なハックを加えずにそれを行う安全な方法がないため、通常は、この制約を回避するように設計を変更することをお勧めします (通常、コンストラクターに注入するか、アクセサー、他の回答が示唆するように)。しかし、明示的にクラスを返したい場合A
、それは簡単な答えです...
クラスは Ruby のオブジェクトであり、定数に格納されます。メソッド本体内の定数は、メソッドが呼び出されるまで評価されないため、この場合A
、メソッドから単純に戻ることができます。
class B
def f
A
end
end
class A
attr_reader :a
def initialize()
@a = B.new
end
end
A.new.a.f #=> A