中斷訊息
有兩種方法可以中斷訊息。
- 使用
method_missing
中斷任何未定義的訊息。 - 在鏈的中間定義一個方法來攔截訊息
中斷訊息後,可以:
- 回覆他們。
- 將它們傳送到其他地方。
- 修改訊息或其結果。
通過 method_missing
中斷並回復訊息:
class Example
def foo
@foo
end
def method_missing name, data
return super unless name.to_s =~ /=$/
name = name.to_s.sub(/=$/, "")
instance_variable_set "@#{name}", data
end
end
e = Example.new
e.foo = :foo
e.foo # => :foo
攔截訊息並修改它:
class Example
def initialize title, body
end
end
class SubExample < Example
end
現在讓我們假設我們的資料是“title:body”,我們必須在呼叫 Example
之前拆分它們。我們可以在 SubExample
上定義 initialize
。
class SubExample < Example
def initialize raw_data
processed_data = raw_data.split ":"
super processed_data[0], processed_data[1]
end
end
攔截訊息並將其傳送到另一個物件:
class ObscureLogicProcessor
def process data
:ok
end
end
class NormalLogicProcessor
def process data
:not_ok
end
end
class WrapperProcessor < NormalLogicProcessor
def process data
return ObscureLogicProcessor.new.process data if data.obscure?
super
end
end