从调用方法的实例类返回Ruby类名

时间:2012-11-09 08:10:25

标签: ruby instance-variables

我需要从调用方法f的类中返回一个类名。 如果没有继承,我怎么能这样做?而且......有可能吗?!

我正在使用Ruby 1.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

3 个答案:

答案 0 :(得分: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"

答案 1 :(得分: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.a.f,这就不行了

答案 2 :(得分:0)

您是否希望从字面上返回类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