Я бы хотел, чтобы объект person (экземпляр класса Person ) говорил на языке (который представляет собой набор открытых методов, хранящихся в Language модуль):
class Person
attr_accessor :current_language
def quit
# Unselect the current language, if any:
@current_language = nil
end
end
Предположим, что языки следующие:
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
Пример использования:
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)"
Как видите, язык - это протокол. Таким образом, человек может включить определенный протокол, но только один за раз.
По модульным причинам хранение каждого языка в модуле является дружественным. Так что я думаю, что этот путь более логичен для Ruby, не так ли?
Но я считаю, что невозможно написать что-то вроде этого:
class Person
include "Language::#{@current_language}" unless @current_language.nil?
end
По вашему мнению, какой должна быть лучшая практика для этого?
Любые комментарии и сообщения приветствуются. Спасибо.
Привет