У меня есть текстовый журнал из игры с (например) двумя типами записей, а именно. Чат и Событие. По большей части они очень похожи, поэтому у меня есть класс 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
. Кто-нибудь знает, как мне добиться этого?
Edit:
Я изменил свои примеры, потому что многие ответы были сосредоточены на итерации по многим записям. Ответ Чака элегантно показывает, что эта ситуация не проблема.
В случае, если это вызывает у кого-то интерес, я наткнулся на Evil Ruby , который позволяет вам вмешиваться в `self.class '. Есть хорошая статья о Orielly под названием Ruby-код, который поглотит вашу душу! Я изучаю ее, чтобы узнать, предлагает ли она какие-либо ответы. (Правка: evil.rb хорошо назван! То, что низкий уровень «не кажется» подходящим для стабильного / долгосрочного распространения.)