gpt4 book ai didi

使用点符号的 Ruby 访问属性

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

我正在尝试构建一个基本上用作存储值/嵌套值的数据结构的类。我希望有两种方法,getset,它们接受以点标记的路径以递归地设置或获取变量。

例如:

bag = ParamBag.new
bag.get('foo.bar') # => nil
bag.set('foo.bar', 'baz')
bag.get('foo.bar') # => 'baz'

如果值不存在,get 方法也可以采用默认返回值:

bag.get('foo.baz', false) # => false

我还可以用哈希初始化一个新的 ParamBag

我如何在 Ruby 中管理它?我已经用其他语言做到了这一点,但为了设置递归路径,我会通过引用获取值,但我不确定在 Ruby 中如何做到这一点。

最佳答案

这是一个有趣的练习,但仍然属于“你可能不应该这样做”的类别。

要完成您想要的,可以使用 OpenStruct 稍作修改。

class ParamBag < OpenStruct
def method_missing(name, *args, &block)
if super.nil?
modifiable[new_ostruct_member(name)] = ParamBag.new
end
end
end

这个类可以让您将任意数量的方法调用链接在一起,并设置任意数量的参数。

使用 Ruby 2.2.1 测试

2.2.1 :023 > p = ParamBag.new
=> #<ParamBag>
2.2.1 :024 > p.foo
=> #<ParamBag>
2.2.1 :025 > p.foo.bar
=> #<ParamBag>
2.2.1 :026 > p.foo.bar = {}
=> {}
2.2.1 :027 > p.foo.bar
=> {}
2.2.1 :028 > p.foo.bar = 'abc'
=> "abc"

基本上,将您的 getset 方法拿走并像往常一样调用方法。

我不建议你真的这样做,我建议你单独使用 OpenStruct 来获得一些灵 active ,而不会太疯狂。如果您发现自己需要链接大量方法并且让它们永远不会失败,也许可以退后一步问问“这真的是解决这个问题的正确方法吗?”。如果这个问题的答案是肯定的,那么 ParamBag 可能就是完美的。

关于使用点符号的 Ruby 访问属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32915889/

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