我有一个接受参数的方法,该参数可以是数组/类似对象或哈希。该方法的要点是一样的东西:如何检测类似数组或类似的值,同时避免类型检查
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
方法,但设置并不to_ary
回应。实现这个方法的对象应该基本上是数组,我同意Set不是一个基本的数组。见Consequences of implementing to_int and to_str in Ruby - 我无法检查
to_a
因为哈希响应它 的方法是共同的阵列和设置,而不是哈希是:
[:&, :+, :-, :<<, :collect!, :flatten!, :map!, :|]
我决定去像这样:
query = {:_id => {'$in' => query.to_a}} if query.respond_to? :&
因为相交可能是一个集合类对象将具有的运算符。但我不确定这一点。
基本上你说的是鸭子打字。如果它可以像数组一样操作,则不关心对象是什么。因此,将'.to_a'添加到对象并查看它是否可以转换为数组。如果你想要一个散列,你可能想转换为一个数组,然后构造一个散列:'Hash [* array.to_a.flatten]'。那时,呼叫者的工作就是要求适当的班级,而不是你。 –