gpt4 book ai didi

ruby - 如何在避免类型检查的同时检测类似数组或集合的值

转载 作者:可可西里 更新时间:2023-11-01 09:59:51 25 4
gpt4 key购买 nike

我有一个接受参数的方法,该参数可以是类似数组/集合的对象,也可以是散列。该方法的要点是这样的:

def find(query = {})
if Array === query or Set === query
query = {:_id => {'$in' => query.to_a}}
end
mongo_collection.find(query)
end

该方法将接受一组 ID 对象并将其转换为 MongoDB 的哈希条件。

上面代码的两个问题:

  1. 如果标准库不需要'set',它将失败。我不想仅仅为了执行检查而需要依赖项。
  2. 我不想进行严格的类型比较。我想接受任何类似数组或集合的值,并使用 to_a 将其转换为值数组。

您将如何执行此检查?需要牢记的一些注意事项:

  1. 我可以检查 to_ary 方法,但 Set 不响应 to_ary。实现此方法的对象基本上应该是数组,我同意 Set 从根本上不是数组。参见 Consequences of implementing to_int and to_str in Ruby
  2. 我无法检查 to_a,因为 Hash 会响应它
  3. Array 和 Set 通用但 Hash 不通用的方法是:

    [:&, :+, :-, :<<, :collect!, :flatten!, :map!, :|]

我决定采用这样的方式:

query = {:_id => {'$in' => query.to_a}} if query.respond_to? :&

因为交集很可能是集合类对象的运算符。但我不确定这一点。

最佳答案

这是我的看法:

if not Hash === query and query.respond_to? :to_a

我只是检查 to_a,这是我唯一感兴趣的方法,但还要确保它不是 Hash 对象。我对哈希使用严格的类型检查,但这只是因为这是最不可能作为完全独立的类传递的对象,它基本上是哈希。

关于ruby - 如何在避免类型检查的同时检测类似数组或集合的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6768267/

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