我有一个方法,它接受一个参数,该参数可以是类似数组/集合的对象,也可以是哈希。该方法的要点如下:
def find(query = {})
if Array === query or Set === query
query = {:_id => {'$in' => query.to_a}}
end
mongo_collection.find(query)
end
该方法将接受一组 ID 对象并将其转换为 MongoDB 的哈希条件。
上述代码的两个问题:
- 如果标准库中不需要“set”,则会失败。我不想仅仅为了执行检查而需要依赖项。
- 我不想进行严格的类型比较。我想接受任何类似数组或类似集合的值,并使用
to_a
将其转换为值数组。
您将如何执行此检查?需要牢记的一些注意事项:
- 我可以检查
to_ary
方法,但 Set 不响应to_ary
。实现此方法的对象本质上应该是数组,并且我同意 Set 本质上不是数组。请参阅Consequences of implementing to_int and to_str in Ruby - 我无法检查
to_a
,因为 Hash 响应了它 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/