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

标签 ruby mongodb types set duck-typing

我有一个方法,它接受一个参数,该参数可以是类似数组/集合的对象,也可以是哈希。该方法的要点如下:

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/

相关文章:

c - char 是否保证恰好是 8 位长?

ruby - 在 ruby​​ 上,为什么 include 是私有(private)的而 extend 是公共(public)的?

jquery - MongoDB:如何从 json 数据中找到一个值?

c# - 在 C# 中构建(转义)JavaScript 正则表达式

haskell - 了解具有类约束的 2 级类型别名

Java - 当返回类型对自己的方法参数类型使用泛型时覆盖扩展接口(interface)的返回类型

Ruby:否定传递给 proc 的散列?

ruby - 使用 Jekyll/Liquid 将 Markdown 内容传递给 Ruby 函数

ruby - 如何在 irb 控制台中使用 open() 从 .txt 文件中打印出基本文本? # ruby

node.js - Mongo 的 Cursor.nextObject 有时会错误返回 Null?