Ruby Language Interruzione dei messaggi


Esempio

Esistono due modi per interrompere i messaggi.

  • Utilizzare method_missing per interrompere qualsiasi messaggio non definito.
  • Definire un metodo nel mezzo di una catena per intercettare il messaggio

Dopo aver interrotto i messaggi, è possibile:

  • Rispondi a loro.
  • Mandali da qualche altra parte.
  • Modifica il messaggio o il suo risultato.

Interrompere tramite method_missing e rispondere al messaggio:

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

Intercettare il messaggio e modificarlo:

class Example
  def initialize title, body
  end
end

class SubExample < Example
end

Ora immaginiamo che i nostri dati siano "title: body" e dobbiamo suddividerli prima di chiamare Example . Possiamo definire l' initialize su SubExample .

class SubExample < Example
  def initialize raw_data
    processed_data = raw_data.split ":"

    super processed_data[0], processed_data[1]
  end
end

Intercettazione del messaggio e invio a un altro oggetto:

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