2012-02-08 3 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

Вот то, что вы можете начать с

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 

Он вернется true если классы совпадают и false иначе.

Расчет индексов отсутствует.

+0

Я знаю, что мое предложение для возвращаемого значения не указано полностью. Вот почему я прошу об этом. – sawa

+0

@sawa: Извините, не внимательно прочитал. –

6

is_a? or kind_of? делать то, о чем вы просите ... хотя вы, кажется, знаете, что уже (?).

+0

Я думаю, что смогу его реализовать, но если уже есть аналогичная вещь, я не хочу изобретать колесо. Я не уверен в этом. А также хотел предложить, как должен выглядеть формат ошибки (возвращаемое значение). – sawa

Смежные вопросы