ruby - Ruby 中的“只追加”/“只写”哈希
问题描述
我正在寻找一种“仅附加”哈希,其中键只能设置一次。
例如:
capitals = AppendOnlyHash.new
capitals['france'] = 'paris'
capitals['japan'] = 'tokyo'
capitals['france'] = 'nice' # raises immutable exception
任何图书馆建议或想法如何实现这一目标?
(用例是一个日志类型对象,它将被传递给许多松散连接的类,并希望检测是否有任何使用相同的键。)
解决方案
有 10 种方法,直接改变哈希:
Hash.instance_methods.grep(/.+!\z/) << %i|[]= delete keep_if|
#⇒ [:select!, :filter!, :reject!, :compact!, delete, keep_if,
# :transform_keys!, :transform_values!, :merge!, :[]=]
此外,有可能改变值本身(capitals['france'] << ' and Lyon'
,),所以我们也要防止这种情况发生。
class MyHash < Hash; end
MyHash.prepend(
Module.new do
(Hash.instance_methods.grep(/.+!\z/) | %i|delete keep_if|).each do |method|
define_method(method) do |*args|
raise "Method #{method} is restricted since it is mutating"
end
end
def []=(key, val)
raise "This hash is immutable" if key?(key)
super(key, val.freeze) # to prevent inplace mutations
end
end
)
需要从中派生,Hash
否则我们将破坏所有哈希值。
我没有测试这段代码,但它应该可以开箱即用,(如果没有,这个想法应该很清楚。)
推荐阅读
- python - 将 Dash 用作 Figure 的错误作为传递给 Graph 的无效参数“figure.layout”,预期为“对象”。提供类型“数组”
- sitecore - 默认体验分析仪表板报告的自定义过滤
- java - 使用休眠返回查询的错误计数值
- android - 运行cordova run android时依赖失败
- sql - SQL 临时表上的后缀
- reactjs - 在公共反应目录中隐藏目录列表
- php - 将 SUM(tbl_column) 与 $print 一起使用时未定义的常量
- angularjs - 单击按钮后如何关闭angular-ui模态但在条件下
- google-kubernetes-engine - 如何修复不健康的后端服务?
- r - 错误:未找到 TensorFlow 的安装