是否有类似于Array#wrap for Hashes的解决方案?

时间:2017-06-22 17:24:37

标签: ruby ruby-on-rails-4 interface hashmap type-safety

我一直使用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

2 个答案:

答案 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”或更隐蔽的方法。

但是那时候,你不再包装了,你正在解析。解析依赖于格式正确的数据并具有多个故障点。无论你如何看待它,如果你发现自己处于可能有或没有哈希的情况,这意味着你需要编写一个适当的代码块来进行数据验证和解析(或者重构您的上游代码,以便您始终可以期待哈希)。