2012-02-08 7 views
3

オブジェクトのクラスチェックを行うための良いライブラリ(できれば宝石)がありますか?難しいのは、単純なオブジェクトのタイプをチェックしたいだけでなく、配列やハッシュがあればそれを調べ、そのコンポーネントのクラスをチェックしたいということです。たとえば、私は、オブジェクトがある場合、:クラス(型)チェック

object = [ 
    "some string", 
    4732841, 
    [ 
    "another string", 
    {:some_symbol => [1, 2, 3]} 
    ], 
] 

を私は細部のさまざまなレベルに確認できるようにしたい、とクラスの不一致がある場合、私はそれはいくつかの合理的な方法で位置を返したいです。そのようなライブラリが存在しない場合、誰かが(私の中に私の方向を示すことができる

object.class_check(Array) # => nil (`nil` will mean the class matches) 
object.class_check([String, Fixnum, Array]) # => nil 
object.class_check([String, Integer, Array]) # => nil 
object.class_check([String, String, Array]) # => [1] (This indicates the position of class mismatch) 
object.class_check([String, Fixnum, [Symbol, Hash]) # => [2,0] (meaning type mismatch at object[2][0]) 

:私はまだエラー(クラスの不一致が)フォーマットはどうあるべきかの明確なアイデアを持っているが、このようなものはありませんこれを実装する必要がありますか?おそらく、私はkind_of?と再帰的定義を使うべきです。

答えて

7

あなたは、クラスがそうでなければ一致するとfalse場合にはtrueを返します

class Object 
    def class_check(tclass) 
    return self.kind_of? tclass unless tclass.kind_of? Array 
    return false unless self.kind_of? Array 
    return false unless length == tclass.length 
    zip(tclass).each { | a, b | return false unless a.class_check(b) } 
    true 
    end 
end 

で始めることができるものです。

インデックスの計算がありません。

+0

戻り値の提案が完全には指定されていないことは知っています。だから私はそれについての提案を求めている。 – sawa

+0

@sawa:申し訳ありませんが、慎重に読んでいませんでした。 –

6

is_a? or kind_of?あなたはあなたが既にそれを知っているように見えますが...(?)あなたは何を求めていますか?ここで

+0

私はそれを実装することができるかもしれないと思うが、すでに似たようなことがある場合、私はホイールを再発明したくない。私はそれについてとても自信がない。また、エラー形式(戻り値)をどのようにすべきかについての提案も必要でした。 – sawa