我從遊戲的文本日誌,(例如)兩種類型的條目即。聊天和事件。在大多數情況下,它們非常相似,所以我有一個LogEntry類定義如此;self = Ruby中的後代?
class LogEntry < Array
def initialize(str)
super str.split
end
def parse
LogEntry.parse self
end
def LogEntry.parse(entry)
# Processes the elements that are in any Entry
# Figure out whether it's a Chat entry or an Event entry
# Returns an object of type LogChat or LogEvent
end
end
LogChat和LogEvent都會擴展LogEntry並進一步處理與其域相關的進一步處理。一切都按預期工作;
chat = LogEntry.new("some chat")
event = LogEntry.new("some event")
chat.parse.class # => LogChat
event.parse.class # => LogEvent
問: 類方法本質上LogEntry.parse返回合適類的解析條目。在這種情況下,解析的條目是重要的一點。但是,我們可以在實例方法「解析」重命名爲「what_type_should_i_be?」。我想讓物體作用於信息和「self.become LogEntry.parse(個體經營)」
眼下,解析條目,我必須這樣做;
entry = entry.parse
我想進一步推動這一點,以便我得到相同的結果;
entry.parse
我已經嘗試了明顯;
class LogEntry
def parse
self = LogEntry.parse(self)
end
end
但是,我收到錯誤Can't change the value of self
。有誰知道我應該如何去實現這一目標?
編輯: 我改變了我的例子,因爲許多答案都關注於許多條目的迭代。查克的回答優雅地表明,這種情況不是問題。
如果這引起任何人的興趣,我已經絆倒了Evil Ruby這讓你干涉`self.class'。有一個很好的Orielly一篇關於它叫做Ruby code that will swallow your soul!我尋找到它,看它是否提供任何答案。 (編輯:evil.rb是有名的!低級別似乎不適合穩定/長期分佈的東西。)
+1開始一個有趣的思路。我會看看我是否可以在'parse'方法中實現這個。我想讓對象看看自己並說「實際上,我正在使用這些類型的對象。」 – deau 2009-11-10 18:18:42
你認爲我自己在做些奇怪的事嗎?從理論上講,以這種方式控制自己的對象是危險的嗎? – deau 2009-11-10 20:26:27
那麼,在技術上不可能設置「自我」而沒有真正的低級別攻擊,這就是我的意思是「對自己做些奇怪的事情」。一個對象不能改變自己的身份(即使你可以在方法中設置self,它不會改變方法外的對象身份 - 變量只是引用)。一個對象只能控制其內部狀態,這就是爲什麼我建議代表可以改變這種方式的東西。 – Chuck 2009-11-10 20:53:23