我有兩個類A和B,他們都有一些選項,通常我會用一個哈希來存儲選項,如@options[:name]='xxxx'
;現在我想重構使用元編程它,如何在Ruby中像這樣設置哈希實例的值?
class A
set_option :name, "james"
set_option :address, "some street"
def hello
puts @options[:name]
puts @options[:address]
end
end
class B
set_option :age, 18
def greeting
put @options[:age]
end
end
在這裏,我想用set_option
設置鍵&值對一個哈希例如@options
,我該怎麼辦呢?
此外我想將解決方案包裝到單獨的模塊中。
更新:
首先感謝,所有的答案都對我有價值,讓我更清楚,現在我知道有些事情我想也不是那麼準確,所以如果我作出這樣的問題?
- 怎樣用一種方法
option
來代替@options
? - A和B兩個類都可以爲同一個鍵設置不同的選項,所以可能會有一些答案'
@@options
將不起作用?我希望不同的類可以有不同的哈希實例。
``` 這樣的:
class A
set_option :name, "james"
set_option :provider, 'twitter'
def hello
puts option[:name]
end
end
class B
set_option :name, "not james"
def greeting
put option[:name]
end
end
左思右想,我認爲我真正想要的是不同的類,而不是類的實例不同的選項哈希實例。
這是我想要的,它可以工作。
module HasOptions
def self.included(cls)
cls.class_eval do
def self.set_option(key, value)
options[key] = value
end
def self.options
@options ||= {}
end
def options
self.class.options
end
end
end
end
class Baz
include HasOptions
set_option :name, "bad"
def greeting
puts options[:name]
end
end
class Foo
include HasOptions
set_option :name, "foo"
def greeting
puts options[:name]
end
end
感謝您的幫助。
感謝@mudasobwa,對於您列出的問題項目,第一個不是我想要的,我想爲不同的類使用不同的哈希實例。 – donnior 2013-02-18 03:36:35
@donnior然後在評論中建議的任何解決方案中簡單地擺脫雙「@」,轉而選擇「@ options」.-) – mudasobwa 2013-02-18 06:15:04