使用运行时确定的属性定义结构体

Pet*_* Al 1 ruby

我注意到 Ruby 的理念是在运行时保持尽可能多的灵活性。

这是一个典型的(据我所知)Ruby 结构定义:

    Person = Struct.new("Person", :name, :address)
    Person.new("John", "Chicago, IL")
Run Code Online (Sandbox Code Playgroud)

我的问题是,当结构字段/成员列表也在运行时定义时,是否可以在运行时定义结构?看起来像这样的东西:

    Person = Struct.new("Person", list_of_structure_fields)
Run Code Online (Sandbox Code Playgroud)

Mic*_*ohl 5

你可以直接splat一个数组:

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

这可以让你做一些有趣的事情:

person = {name: "John", address: "Chicago, IL"}
Person = Struct.new("Person", *person.keys)
Person.new(*person.values)
#=> #<struct Struct::Person name="John", address="Chicago, IL">
Run Code Online (Sandbox Code Playgroud)