我想允许人对象(从人类实例化)讲一种语言(这是存储在语言模块的公共方法的集合):红宝石 - 协议(含模块)之间进行动态切换
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
根据你,你应该是这样做的最佳做法是什么?
欢迎任何评论和消息。谢谢。
问候
谢谢你马克对这个技巧。那工作得很好!然而,我想这个模块的方法被动态地(有一种动态包含)合并到一个对象中,然后(例如)用person.public_send()访问它们。因此,实例变量可以从新方法访问。 – 2010-04-29 18:50:17