Los métodos introspectivos mas usados son los que determinan el tipo de un objeto.
>> obj = [1, {:a => 2}]
=> [1, {:a=>2}]
>> obj.class # retorna la clase de un objeto
=> Array
>> obj.class.superclass # retorna la superclase de un objeto
=> Object
>> obj.instance_of? Object # determina si obj.class == Object
=> false
>> obj.instance_of? Array
=> true
>> obj.is_a? Object # determina si obj es de una subclase de Object
=> true
>> obj.is_a? Array
=> true
>> obj.kind_of? Object # kind_of? es un sinónimo de is_a?
=> true
>> Array === obj # equivalente a obj.is_a? Array
=> true
>> Object === obj
=> true
>> obj.respond_to? 'each' # si tiene un método público o protected llamado 'each'
=> true # si se le pasa true como segundo argumento se comprueban
# también los privados
>> Array.instance_methods(false)
=> ["insert"
"sort" "include?" "size" "&" "to_ary" "clear" "yaml_initialize" "shuffle"
"replace" "pack" "zip" "flatten!" "to_s" "pop" "pretty_print_cycle" "hash"
"cycle" "*" "indices" "nitems" "index" "collect" "+" "compact!"
"last" "rassoc" "count" "drop" "delete" "delete_at" "combination" "collect!"
"select" "each_index" "-" "flatten" "eql?" "fill" "length" "uniq!"
"at" "choice" "reject!" "[]" "take" "inspect" "shift" "compact"
"pretty_print" "[]=" "|" "find_index" "slice!" "each" "empty?" "transpose"
"<<" "frozen?" "rindex" "map" "reverse_each" "reverse!" "to_a" "push"
"uniq" "delete_if" "first" "product" "drop_while" "concat" "reject"
"map!" "join" "slice" "indexes" "taguri" "<=>" "assoc" "fetch" "to_yaml"
"==" "values_at" "permutation" "take_while" "unshift" "reverse"
"sort!" "shuffle!" "taguri="]