我有一个散列散列,我需要将它转换为方法,其中键是方法名,值是方法返回的值,但附加的要求是,如果一个值也是一个散列,则返回整个值。
例如:
hash = {:a => 1, :b => 2, :c => { :a => 1, :b => 2, :c => 3} }
hash.c.a #=> 1
hash.c #=> { :a => 1, :b => 2, :c => 3}
我怎么能这么做?帮助感激。
发布于 2015-02-07 10:07:31
您可以使用OpenStruct创建这样的数据结构。例如:
require 'ostruct'
s = OpenStruct.new(a: 1, b: 2, c: OpenStruct.new(a: 1, b: 2, c: 3))
s.c.a # => 1
s.c # => #<OpenStruct a=1, b=2, c=3>
发布于 2015-02-07 10:42:49
发布于 2015-02-07 13:13:59
由于接收方是哈希,所以必须在类Hash
上定义方法。
def makem(h)
h.each do |k,v|
case v
when Hash
Hash.instance_eval { define_method(k.to_s) { v } }
v.each { |kk,vv| Hash.instance_eval { define_method(kk.to_s) { vv } } }
end
end
end
我们试试看:
h = {:a => 1, :b => 2, :c => { :a => 1, :b => 2, :d => 3 } }
makem(h)
Hash.instance_methods(false).select { |m| m.size == 1 }
#=> [:c, :a, :b, :d]
h.c
#=> {:a=>1, :b=>2, :d=>3}
h.c.a
#=> 1
h.c.b
#=> 2
h.c.d
#=> 3
在你的例子中,你有:
:c => { :a => 1, :b => 2, :c => 3}
如果您想要一个返回上述散列的方法c
,那么显然不能定义另一个名称相同的方法来返回3
。
您可能希望重新考虑定义这些方法的可取性。也许在类中构造诸如def m(hash, key)
之类的方法会更有用。
https://stackoverflow.com/questions/28385545
复制相似问题