ゲームのテキストログがあり、(たとえば)2種類のエントリがあります。チャットとイベント。ほとんどの場合、それらは非常に似ているので、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
。誰かが私がこれを達成するためにどのように行くべきか知っていますか?
編集: 多くの回答が多くのエントリの反復に焦点を合わせていたため、例を変更しました。チャックの答えは、この状況が問題ではないことをエレガントに示しています。
これが誰かの興味をそそる場合に備えて、私はあなたが`self.class'に干渉しようとするEvilRubyに出くわしました。あなたの魂を飲み込むRubyコードと呼ばれるそれについての素晴らしいOriellyの記事があります! 私はそれが何か答えを提供するかどうかを調べるためにそれを調べています。(編集:evil.rbはよく名付けられています!低レベルでは安定した/長期的な配布には適していないようです。)