Je voudrais permettre à un parler une langue (qui est une collection de méthodes publiques stockées dans Langue module objet personne (instancié d'une classe Personne)):Ruby - Commutation dynamique entre les protocoles (avec des modules)
class Person
attr_accessor :current_language
def quit
# Unselect the current language, if any:
@current_language = nil
end
end
Supposons que les langues sont les suivantes:
module Language
module Japanese
def konnichiwa
"こんにちは! (from #{@current_language} instance variable)"
end
def sayounara
"さようなら。"
end
end
module French
def bonjour
"Bonjour ! (from #{@current_language} instance variable)"
end
def au_revoir
"Au revoir."
end
end
module English
def hello
"Hello! (from #{@current_language} instance variable)"
end
def bye
"Bye."
end
end
end
Exemple d'utilisation:
person = Person.new
person.current_language # => nil
person.hello # => may raise a nice no method error
person.current_language = :english
person.hello # => "Hello! (from english instance variable)"
person.bonjour # => may also raise a no method error
person.quit
person.current_language = :french
person.bonjour # => "Bonjour ! (from french instance variable)"
Comme vous pouvez le voir, un langage est tel qu'un protocole. Ainsi, une personne peut activer un protocole spécifique, mais un seul à la fois.
Pour des raisons modulaires, le stockage de chaque langue dans un module est amical. Donc, je pense que c'est la façon la plus logique de Ruby, n'est-ce pas.
Mais, je crois qu'il est impossible d'écrire quelque chose comme ceci:
class Person
include "Language::#{@current_language}" unless @current_language.nil?
end
Selon vous, quelle devrait être la meilleure pratique de le faire?
Tous les commentaires et messages sont les bienvenus. Je vous remercie.
Cordialement
Merci Mark pour cette astuce. Et ça marche bien! Cependant, je voudrais que les méthodes de ce module soient fusionnées et non fusionnées dynamiquement (avec une sorte d'inclusion dynamique) dans l'objet ... et puis (par exemple) y accèdent avec person.public_send(). Ainsi, les variables d'instance sont accessibles à partir des nouvelles méthodes. –