Ruby Language Interruption des messages


Exemple

Il existe deux manières d’interrompre les messages.

  • Utilisez method_missing pour interrompre tout message non défini.
  • Définir une méthode en milieu de chaîne pour intercepter le message

Après avoir interrompu les messages, il est possible de:

  • Leur réponds.
  • Envoyez-les ailleurs.
  • Modifier le message ou son résultat.

Interrompre via method_missing et répondre au message:

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

Interception du message et modification:

class Example
  def initialize title, body
  end
end

class SubExample < Example
end

Imaginons maintenant que nos données sont "title: body" et que nous devons les séparer avant d'appeler Example . Nous pouvons définir l' initialize sur SubExample .

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

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

Intercepter un message et l'envoyer à un autre objet:

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