2012-11-09 55 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 
相關問題