2012-06-22 43 views
0

我注意到Ruby在运行时尽可能保持灵活性的哲学。定义一个在运行时确定属性的结构体

这里是一个典型的(最好的我所知)红宝石结构定义:

Person = Struct.new("Person", :name, :address) 
    Person.new("John", "Chicago, IL") 

我的问题是,是否有可能定义在运行时的结构时,结构字段/成员名单也是在运行时定义的?东西会看起来像这样:

Person = Struct.new("Person", list_of_structure_fields) 

回答

4

你可以splat数组:

fields = [:name, :address] 
Person = Struct.new("Person", *fields) 
Person.new("John", "Chicago, IL") 
#=> #<struct Struct::Person name="John", address="Chicago, IL"> 

这允许你做一些有趣的事情:

person = {name: "John", address: "Chicago, IL"} 
Person = Struct.new("Person", *person.keys) 
Person.new(*person.values) 
#=> #<struct Struct::Person name="John", address="Chicago, IL"> 
+0

太棒了,这正是我一直在寻找的。谢谢! –

1

OpenStruct设计只是做即:

require 'ostruct' 
h = {name: "John", address: "Chicago, IL"} 
person = OpenStruct.new(h) 
puts person.name #=> John 
person.age = 35 # freely add fields and values 
+0

很高兴知道。谢谢! –