我有一个接受参数的方法,该参数可以是类似数组/集合的对象或哈希。该方法的要点如下:
def find(query = {})
if Array === query or Set === query
query = {:_id => {'$in' => query.to_a}}
end
mongo_collection.find(query)
end
该方法将接受一组 ID 对象并将其转换为 MongoDB 的哈希条件。
上面代码有两个问题:
- 如果标准库不需要“设置”,它将失败。我不想仅仅为了执行检查而要求依赖。
- 我不想进行严格的类型比较。我想接受任何类似数组或类似集合的值,并将其转换为带有
to_a
.
您将如何执行此检查?需要记住的一些注意事项:
- 我可以检查
to_ary
方法,但 Set 不响应to_ary
. 实现此方法的对象本质上应该是数组,我同意 Set 本质上不是数组。请参阅在 Ruby 中实现 to_int 和 to_str 的后果 - 我无法检查,
to_a
因为哈希响应它 Array 和 Set 通用但 Hash 不通用的方法是:
[:&, :+, :-, :<<, :collect!, :flatten!, :map!, :|]
我决定用这样的东西:
query = {:_id => {'$in' => query.to_a}} if query.respond_to? :&
因为交集很可能是一个类似集合的对象的运算符。但我不确定这一点。