2012-03-02 6 views
12

¿Cuál es la mejor manera de usar un objeto de clase en la declaración de caso? Supongamos que tengo a que es una instancia de la clase Class. Quiero emparejarlo con diferentes clases. Si hagoUso de un objeto de clase en la declaración de caso

case a 
when String then ... 
when Fixnum then ... 
end 

esto no da el resultado esperado ya que aunque a == String por ejemplo, a === String no es cierto. ¿Cuál es la forma inteligente de hacer esto?

+1

mismo tema [aquí] (http://stackoverflow.com/questions/3908380/ruby-class-types-and-case-statements) –

+2

@selman La pregunta que ha vinculado es irrelevante. El 'item' en ese ejemplo no es una instancia de clase. – sawa

Respuesta

13

No utilizaría to_s, porque "String".to_s habría "String", así que tal vez lo haría

case 
when a == String then ... 
when a == Fixnum then ... 
end 

o

a = String 

case [a] 
when [String] then puts "String" 
when [Array] then puts "Array" 
end 
+1

No entiendo por qué funciona el truco '[]'. Hace más o menos exactamente lo que yo quiero. ¿Podría darnos algún consejo? – wrtsprt

-1

Mi respuesta temporal es usar to_s, pero no estoy seguro si esto es lo mejor que se puede hacer. Esperando mejores respuestas.

case a.to_s 
when "String" then ... 
when "Fixnum" then ... 
end 
11

El problema de usar algo como esto:

case a.to_s 
when "String" then ... 
when "Fixnum" then ... 
end 

es que se pierde por completo subclases para que pueda obtener algo que es una cadena, pero se pierde por la primera rama. Además, name sería una mejor opción que to_s ya que, semánticamente, está probando el nombre de la clase en lugar de su representación de cadena; el resultado puede ser el mismo, pero case a.name sería más claro.

Si desea utilizar un case y hacer frente a la subclasificación entonces se podría utilizar Module#<= así:

case 
when a <= String then ... 
when a <= Fixnum then ... 
end 

Sí, usted tiene que repetir en cada awhen pero eso es sólo la forma en case obras.

-1

Debido

Array === Array # return false 

y "caso cuando "significa" === ", entonces cumple con el problema.

Cuestiones relacionadas