2009-05-06 11 views
40

¿Cuál es la diferencia entre los métodos de clase y tipo en Ruby? Me di cuenta de que ese tipo funciona para encontrar el tipo de algunas clases pero no otras.clase() vs. tipo() en Ruby

Respuesta

48

La diferencia clave es que Object#type está en desuso. Del RDoc para el tipo de objeto #:

Sinónimo obsoleto para Object # class.

He aquí por qué usted debe utilizar Object#class:

devuelve la clase de obj, ahora preferido sobre objetos # tipo, como un tipo de objeto en Ruby es solamente libremente ligado a ese objeto 'clase S. Este método siempre debe invocarse con un receptor explícito , ya que la clase también es una palabra reservada en Ruby.

En realidad, es probable que quieren usar Object#respond_to? en lugar de la comprobación de la clase de un objeto en la mayoría de los casos.

+0

Si es un sinónimo, ¿por qué obtendría un error de método indefinido cuando llamo a un tipo en una clase que he definido yo mismo? Pero lo mismo no sucede cuando llamo al método de clase para la misma clase. El error de método indefinido no suena como lo que obtendrías por un método obsoleto. –

+0

@Chris Collins, supongo que el documento está desactivado, y que no es un sinónimo estricto. El punto sigue siendo que el tipo de Objeto # es un método sin uso. – runako

+4

¿Por qué usar responder_a? –

15

#type es un sinónimo de #class, pero está en desuso en ruby ​​1.8, y aparentemente ha desaparecido de ruby ​​1.9. Simplemente use #class en todas partes.

 

# For ruby 1.8 

$ ri Object#type 
------------------------------------------------------------ Object#type 
    obj.type => class 
------------------------------------------------------------------------ 
    Deprecated synonym for Object#class. 


# For ruby 1.9 

$ ri1.9 Object#type 
Nothing known about Object#type 
+0

Si es un sinónimo, ¿por qué obtendría un error de método indefinido cuando llamo a tipo en una clase que he definido? Pero lo mismo no sucede cuando llamo al método de clase para la misma clase. El error de método indefinido no suena como lo que obtendrías por un método obsoleto. –

+0

¿Estás en ruby ​​1.9? En ruby ​​1.8 no me sale un error, solo una advertencia sobre la desaprobación. – kch

+0

Y si estás en ruby ​​1.9, bueno, desaprobar significa que se eliminará algo cuando, y parece que 1.9 es eso cuando. – kch