Pregunta Ruby Nil y Zero


¿Cuál es la ciencia detrás del hecho de que el método to_i en las instancias Ruby's NilClass arroja cero? Regresando nulo o plantear una excepción no sería más lógico?


13
2018-06-17 18:40


origen


Respuestas:


NilClass define #to_i por la misma razón que define una #to_a eso regresa []. Te está dando algo del tipo correcto pero un tipo vacío de valor.

Esto es bastante útil. Por ejemplo:

<%= big.long.expr.nil? ? "" : big.long.expr %>

se convierte en:

<%= big.long.expr %>

¡Mucho más bonito! (Erb llama #to_s que, por nada, es "".) Y:

if how.now.brown.cow && how.now.brown.cow[0]
  how.now.brown.cow[0]
else
  0
end

se convierte en:

how.now.brown.cow.to_a[0].to_i

Las conversiones cortas existen cuando solo se necesita una representación. Las conversiones largas son las que los métodos centrales de Ruby llaman y requieren algo muy cercano. Úselos si quiere una verificación de tipo.

Es decir:

thing.to_int # only works when almost Integer already. NilClass throws NoMethodError

thing.to_i # this works for anything that cares to define a conversion

13
2018-06-18 01:44



Se ajusta a la filosofía de permisividad de Ruby (en oposición a, por ejemplo, el rigor de Python):

nil.to_i #=> 0 
"".to_i #=> 0
"123hello".to_i #=> 123
"hello".to_i #=> 0

Como lo señaló Zabba, puedes usar Kernel # Integer (cadena) para una conversión estricta


14
2018-06-17 19:05



to_i significa "convertirme a un entero si puedes".

Si quieres "si eres muy parecida a un entero, dame tu valor entero, sino da un NoMethodError", luego usa .to_int.

Hay otra pregunta que pregunta acerca de la diferencia entre to_i y to_int, to_s versus to_str, etc. Avíseme si desea que lo encuentre para usted.


6
2018-06-18 01:20



El protocolo de to_i dice que tu debe devolver un Integer y tu no debe plantear una excepción Ambas sugerencias violan al menos una de esas reglas. Entonces, no, esos no solo no serían más lógicos, serían simplemente inválidos.

Tenga en cuenta, sin embargo, que nil  no responder a to_int. Si se hizo responder a to_int, eso sería, de hecho, ser "ilógico".


6
2018-06-18 02:36



Si está en Rails, puede usar try:

nil.to_i # => 0
nil.try :to_i # => nil

2
2018-04-10 19:27