我有两个类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