我一直使用Array.wrap(x)
以确保在调用对象之前实际存在Array方法。
同样确保哈希的最佳方式是什么?
示例:
def ensure_hash(x)
# TODO: this is what I'm looking for
end
values = [nil,1,[],{},'',:a,1.0]
values.all?{|x| ensure_hash(x).respond_to?(:keys) } # true
答案 0 :(得分:3)
到目前为止,我能够提出的最好的是:
Hash::try_convert(x) || {}
但是,我更喜欢更优雅的东西。
答案 1 :(得分:2)
TL;博士:在一个具有适当错误处理的应用程序中,没有“简单,轻松”的方式来处理可能有或没有任何不足的事情。
从概念的角度来看,答案是 no 。对于哈希,没有与Array.wrap(x)
类似的解决方案。
数组是值的集合。单个值可以存储在数组之外(例如x = 42
),因此将值包装在数组(a = [42]
)中是一项直接的任务。
哈希是键值对的集合。在ruby中,单个键值对不能存在于散列之外。表达键值对的唯一方法是使用哈希:h = { v: 42 }
当然,有一千种方法可以将键值对表示为单个值。您可以使用数组[k, v]
或分隔字符串“k:v”或更隐蔽的方法。
但是那时候,你不再包装了,你正在解析。解析依赖于格式正确的数据并具有多个故障点。无论你如何看待它,如果你发现自己处于可能有或没有哈希的情况,这意味着你需要编写一个适当的代码块来进行数据验证和解析(或者重构您的上游代码,以便您始终可以期待哈希)。