我想允許人對象(從人類實例化)講一種語言(這是存儲在語言模塊的公共方法的集合):紅寶石 - 協議(含模塊)之間進行動態切換
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