And*_*rew 90 ruby metaprogramming instance-variables
假设我有以下哈希:
{ :foo => 'bar', :baz => 'qux' }
Run Code Online (Sandbox Code Playgroud)
如何动态设置键和值以成为对象中的实例变量...
class Example
def initialize( hash )
... magic happens here...
end
end
Run Code Online (Sandbox Code Playgroud)
...所以我最终在模型中得到以下内容......
@foo = 'bar'
@baz = 'qux'
Run Code Online (Sandbox Code Playgroud)
?
Chu*_*uck 165
你正在寻找的方法是instance_variable_set
.所以:
hash.each { |name, value| instance_variable_set(name, value) }
Run Code Online (Sandbox Code Playgroud)
或者,更简单地说,
hash.each &method(:instance_variable_set)
Run Code Online (Sandbox Code Playgroud)
如果您的实例变量名称缺少"@"(因为它们在OP的示例中),您将需要添加它们,因此它更像是:
hash.each { |name, value| instance_variable_set("@#{name}", value) }
Run Code Online (Sandbox Code Playgroud)
Dig*_*oss 12
h = { :foo => 'bar', :baz => 'qux' }
o = Struct.new(*h.keys).new(*h.values)
o.baz
=> "qux"
o.foo
=> "bar"
Run Code Online (Sandbox Code Playgroud)
你也可以使用 send
它来阻止用户设置不存在的实例变量:
def initialize(hash)
hash.each { |key, value| send("#{key}=", value) }
end
Run Code Online (Sandbox Code Playgroud)
send
在课堂上使用时会有一个像二传手一样attr_accessor
实例变量:
class Example
attr_accessor :foo, :baz
def initialize(hash)
hash.each { |key, value| send("#{key}=", value) }
end
end
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
44515 次 |
最近记录: |