我有一个来自游戏的文本日志,其中包含(例如)两种类型的条目,即。聊天和活动。在大多数情况下,它们非常相似,所以我有一个这样定义的 LogEntry 类;
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 本质上返回了相应类的已解析条目。在这种情况下,解析的条目是重要的位。但是我们可以将实例方法“parse”重命名为“what_type_should_i_be?”。我希望对象对该信息和“self.become LogEntry.parse(self)”采取行动
现在,要解析一个条目,我必须这样做;
entry = entry.parse
我想进一步推动这一点,以便得到相同的结果;
entry.parse
我已经尝试了明显的;
class LogEntry
def parse
self = LogEntry.parse(self)
end
end
然而我得到了错误Can't change the value of self
。有谁知道我应该如何实现这一目标?
编辑: 我改变了我的例子,因为许多答案都集中在许多条目的迭代上。Chuck 的回答优雅地表明这种情况不是问题。
万一这引起了任何人的兴趣,我偶然发现了Evil Ruby,它可以让你插手“self.class”。有一篇很好的 Orielly 文章,叫做Ruby 代码,它会吞噬你的灵魂! 我正在调查它,看看它是否提供任何答案。(编辑: evil.rb 名字很好!低级别的东西“似乎”不适合稳定/长期分发。)