,你知道前手的钥匙的替代答案
class Job
attr_accessor :job_name, :position
def initialize(params = {})
self.job_name = params.fetch(:job_name, nil)
self.position = params.fetch(:position, nil)
end
end
class Person
attr_accessor :name, :age, :job
def initialize(params = {})
self.name = params.fetch(:name, nil)
self.age = params.fetch(:age, nil)
self.job = Job.new(params.fetch(:job, {}))
end
end
hash = { :name => 'foo', :age => 1, :job => { :job_name => 'bar', :position => 'soetmhing' }}
p = Person.new(hash)
p.name
==> "foo"
p.job
==> #<Job:0x96cacd8 @job_name="bar", @position="soetmhing">
p.job.name
==> "bar"
我在我个人的扩展库中的'哈希#to_ostruct'方法:http://rubydoc.info/gems/shenanigans/ 1.0.5/Hash:to_ostruct它也可以正确处理嵌套数组和散列。这不是针对这个特定问题的解决方案,但您可能会发现它很有趣。 – 2012-08-13 13:59:18
@MichaelKohl :)非常优雅的解决方案(在git上找到它)。你应该将它作为答案发布。 – 2012-08-13 14:07:20
@MichaelKohl对于不是散列的数组元素,代码是否会失败?可能我错过了一些东西...... – 2012-08-13 14:47:54