gpt4 book ai didi

ruby-on-rails - 有没有一种轻量级的方法来锁定哈希上的一组键?

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

明确地说,我非常高兴自己将此功能实现为自定义类,但我想确保我没有忽略一些 ruby​​ 或 rails 魔法。我用谷歌搜索了关键字“ruby rails hash keys values immutable lock freeze”的每一个有意义的排列。但到目前为止运气不好!


问题:我需要给 Hash 一组键,可能在运行时,然后锁定这组键而不锁定它们的值。类似于以下内容:

to_lock = {}
to_lock[:name] = "Bill"
to_lock[:age] = 42

to_lock.freeze_keys # <-- this is what I'm after, so that:

to_lock[:name] = "Bob" # <-- this works fine,
to_lock[:height] # <-- this returns nil, and
to_lock[:height] = 175 # <-- this throws some RuntimeError

问题:是否有一些 ruby​​ 或 rails 工具可以做到这一点?


我知道Object#freezeImmutable::Hash ,但同时锁定键 值。

坚持使用开箱即用的 ruby​​,可以通过在运行时操作类的方法或访问器来满足用例的大部分需求,如 this 中所示。或 this , 然后覆盖 #method_missing .但这感觉有点笨拙。这些技术也没有真正“锁定”一组方法或访问器,添加更多只是很尴尬。到那时,最好只编写一个完全实现上述代码片段的类,并根据需要进行维护。

最佳答案

您可以通过为散列的“to-lock”实例定义自定义 []= 来实现此目的,您添加了允许的键后:

x = { name: nil, age: nil }

def x.[]=(key, value)
# blow up unless the key already exists in the hash
raise 'no' unless keys.include?(key)
super
end

x[:name] # nil
x[:name] = "Bob" # "Bob"

x[:size] # nil
x[:size] = "large" # raise no

请注意,这不会阻止您无意中使用 merge! 之类的方法添加 key 。

关于ruby-on-rails - 有没有一种轻量级的方法来锁定哈希上的一组键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39603653/

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