gpt4 book ai didi

ruby - 使用访问器方法即时创建对象

转载 作者:数据小太阳 更新时间:2023-10-29 07:11:12 24 4
gpt4 key购买 nike

使用散列定义的访问器方法动态创建对象的最简单方法是什么?例如,如果我有一个散列:

{foo: "Foo", bar: "Bar"}

我想要一个具有访问器方法 foofoo=barbar= 的对象,其初始值分别为 "Foo""Bar" 。我可以想到这样做:

module ObjectWithAccessor
def self.new h; Struct.new(*h.keys).new(*h.values) end
end

o = ObjectWithAccessor.new(foo: "Foo", bar: "Bar")
o.foo # => "Foo"

但是,我不需要它们的多个实例具有相同的特定键集,而是希望每次都使用可能不同的键集创建它的新实例,因此创建一个新类,每个实例具有 Struct每个对象的时间似乎有点过分,我想避免这种情况。有更好的方法吗?

最佳答案

OpenStruct已经提供了你想要的:

require 'ostruct'

o = OpenStruct.new foo: "Foo", bar: "Bar"
o.foo #=> "Foo"
o.bar #=> "Bar"
o.bar = 'BAR'
o.bar #=> "BAR"

或者,如果您不想在创建对象后定义任意属性(就像您可以使用 OpenStruct,您可以这样做:

class ObjectWithAccessor
def initialize attrs
attrs.each do |name, val|
singleton_class.send :attr_accessor, name.to_sym
public_send :"#{name}=", val
end
end
end

o = ObjectWithAccessor.new foo: "Foo", bar: "Bar"
o.foo #=> "Foo"
o.bar #=> "Bar"
o.bar = 'BAR'
o.bar #=> "BAR"
o.bsr = 'typo' #=> #<NoMethodError: undefined method `bsr=' for #<Object:0x007fa4160847f8>>

这仍然不会创建一个新类只是为了使用它一次,并且避免了 OpenStruct 的“开放性”。

关于ruby - 使用访问器方法即时创建对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14790409/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com