2012-11-09 56 views
1

我需要从调用方法f的类中返回一个类名称。 我怎么能没有继承?而且...有可能吗?!从调用方法的实例类返回一个Ruby类名称

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

回答

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

能否请您美化你的代码,并删除IRB的噪音? :) –

+0

它的工作原理,但我很想找到一个解决方案,而不传递一个对象来初始化。我不想初始化在实例中传递的对象。 – facetostool

+0

查看我的回答如下:您可以直接引用'A'。 –

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分两行

+0

绑定与类不是一回事,所以你在这里混合了术语。这里有更多关于绑定:http://www.ruby-doc.org/core-1.9.3/Binding.html –

+0

感谢更正@GregoryBrown(seacreature):) –

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 
相关问题