我需要從調用方法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
我需要從調用方法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
你可以做這樣的事情:
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分兩行
綁定與類不是一回事,所以你在這裏混合了術語。這裏有更多關於綁定:http://www.ruby-doc.org/core-1.9.3/Binding.html –
感謝更正@GregoryBrown(seacreature):) –
您是否正在尋找字面上返回類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
能否請您美化你的代碼,並刪除IRB的噪音? :) –
它的工作原理,但我很想找到一個解決方案,而不傳遞一個對象來初始化。我不想初始化在實例中傳遞的對象。 – facetostool
查看我的回答如下:您可以直接引用'A'。 –