sawa
sawa

Reputation: 168081

Class (Type) checking

Is there a good library (preferably gem) for doing class checking of an object? The difficult part is that I not only want to check the type of a simple object but want to go inside an array or a hash, if any, and check the classes of its components. For example, if I have an object:

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

I want to be able to check with various levels of detail, and if there is class mismatch, then I want it to return the position in some reasonable way. I don't yet have a clear idea of how the error (class mismatch) format should be, but something like this:

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])

If there is no such library, can someone (show me the direction in which I should) implement this? Probably, I should use kind_of? and recursive definition.

Upvotes: 7

Views: 27865

Answers (2)

undur_gongor
undur_gongor

Reputation: 15954

Here is something you can start with

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

It will return true if the classes match and false otherwise.

Calculation of the indices is missing.

Upvotes: 10

Ed Swangren
Ed Swangren

Reputation: 124632

is_a? or kind_of? do what you are asking for... though you seem to know that already(?).

Upvotes: 11

Related Questions