中斷訊息

有兩種方法可以中斷訊息。

  • 使用 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