【问题标题】:Is there a similar solution as Array#wrap for hashes?是否有与 Array#wrap 类似的哈希解决方案?
【发布时间】:2023-03-29 18:13:01
【问题描述】:

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

【问题讨论】:

  • 似乎将任意事物转换为数组要容易得多,因为您只需在其周围添加[]。这甚至对哈希有用吗?什么是key,什么是val?
  • @maxpleaner 我知道,对。这很棘手。有什么想法吗?
  • 您期望什么样的输入?如果您在期待哈希时实际上得到了“任何东西”,那么也许您只是在掩盖真正的问题。
  • “我一直使用 Array.wrap(x)”——你能举一个(实际的)例子吗?
  • @NathanHanna 这个例子看起来很做作,你的实际用例是什么(或者Array#wrap的用例)?

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


【解决方案1】:

到目前为止,我能想到的最好的是:

Hash::try_convert(x) || {}

不过,我更喜欢更优雅的东西。

【讨论】:

  • 鉴于提示,我无法想象比这更优雅的东西了。
【解决方案2】:

tl; dr:在具有适当错误处理的应用程序中,没有“简单、无忧”的方式来处理可能是或可能不是哈希的事情。

从概念的角度来看,答案是。没有与Array.wrap(x) 类似的哈希解决方案。

数组是值的集合。单个值可以存储在数组之外(例如x = 42),因此将值包装在数组中是一项简单的任务(a = [42])。

哈希是键值对的集合。在 ruby​​ 中,单个键值对不能存在于散列之外。表示键值对的唯一方法是使用哈希:h = { v: 42 }

当然,将键值对表示为单个值的方法有上千种。您可以使用数组 [k, v] 或分隔字符串 `"k:v" 或一些更晦涩的方法。

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

【讨论】:

    猜你喜欢
    • 2013-10-01
    • 2017-12-25
    • 1970-01-01
    • 2011-01-22
    • 2018-11-05
    • 1970-01-01
    • 2017-06-13
    • 1970-01-01
    • 2023-04-07
    相关资源
    最近更新 更多