1

実行時にできるだけ多くのものを柔軟に保つというRubyの哲学に気づきました。

これが典型的な(私の知る限り)Ruby構造体の定義です:

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

私の質問は、構造フィールド/メンバーのリストも実行時に定義されている場合、実行時に構造を定義することは可能ですか?このように見えるもの:

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

2 に答える 2

5

配列をスプラットすることができます:

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">
于 2012-06-22T18:22:15.087 に答える
3

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 
于 2012-06-22T21:03:53.213 に答える