Проверка класса (типа) - PullRequest
       13

Проверка класса (типа)

5 голосов
/ 09 февраля 2012

Есть ли хорошая библиотека (предпочтительно gem) для проверки класса объекта?Сложность состоит в том, что я не только хочу проверить тип простого объекта, но и зайти в массив или хеш, если таковые имеются, и проверить классы его компонентов.Например, если у меня есть объект:

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? и рекурсивное определение.

Ответы [ 2 ]

11 голосов
/ 09 февраля 2012

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

9 голосов
/ 09 февраля 2012

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

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 в противном случае.

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

...