0

メソッド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
4

3 に答える 3

4

あなたはこのようなことをすることができます:

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"
于 2012-11-09T08:20:50.160 に答える
0

バインディングを使用していることを除いて、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 行に分けて呼び出すと、これは機能しません。

于 2012-11-09T13:38:52.820 に答える
0

文字通り 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
于 2012-11-09T13:49:06.577 に答える