我有一個接受參數的方法,該參數可以是數組/類似對象或哈希。該方法的要點是一樣的東西:如何檢測類似數組或類似的值,同時避免類型檢查
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]'。那時,呼叫者的工作就是要求適當的班級,而不是你。 –