Array/SetのようなオブジェクトまたはHash型の引数を受け入れるメソッドがあります。型チェックを避けながら配列型または集合型の値を検出する方法
def find(query = {})
if Array === query or Set === query
query = {:_id => {'$in' => query.to_a}}
end
mongo_collection.find(query)
end
方法IDオブジェクトのセットを受け入れ、MongoDBのためのハッシュ条件にそれを向けるだろう。この方法の要点は次のようなものです。上記のコードで
2つの問題:
- 「設定」が標準ライブラリから必要とされていない場合、それは失敗します。私はチェックを実行するだけで依存関係を要求したくありません。
- 私は厳密な型比較をしたくありません。私は任意の配列またはセットのような値を受け入れ、
to_a
で値の配列にキャストしたいと思います。
このチェックはどのように実行しますか?心の中で持っているいくつかの注意事項:
- 私は
to_ary
方法をチェックすることもできますが、設定はto_ary
に応答しません。このメソッドを実装するオブジェクトは基本的に配列でなければならず、私はSetが基本的に配列ではないことに同意します。私は行くことにしました[:&, :+, :-, :<<, :collect!, :flatten!, :map!, :|]
:Consequences of implementing to_int and to_str in Ruby
方法を応答しますので、to_a
をチェックすることはできませんが、ハッシュしないようである参照してください。
これは、集合体のようなオブジェクトが交差する可能性が高いためです。しかし、私はこれについては分かりません。
基本的にあなたはダックタイピングについて話しています。配列のように動作することができるなら、オブジェクトが何であるかは気にしません。したがって、オブジェクトに '.to_a'を追加し、配列に変換できるかどうかを確認してください。ハッシュが必要な場合は、配列に変換してハッシュを作成したいと思うでしょう: 'Hash [* array.to_a.flatten]'。その時点で、適切なクラスを要求するのは発信者の仕事です。 –