¿Cuál es la ciencia detrás del hecho de que el método to_i en las instancias Ruby's NilClass devuelve cero? Devolver nil o plantear una excepción no sería más lógico?Ruby Nil and Zero
Respuesta
NilClass
define #to_i
por la misma razón que define un #to_a
que devuelve [].
Te está dando algo del tipo correcto, sino una especie de vacío valor.
Esto es bastante útil. Por ejemplo:
<%= big.long.expr.nil? ? "" : big.long.expr %>
se convierte en:
<%= big.long.expr %>
Mucho mejor! (Erb está llamando #to_s que, por nula, 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 cortos existen cuando se necesita sólo 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.
Eso es:
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
* "¡Mucho mejor!" * Sí, eso depende de cuán bien tú y cualquier otra persona que trabaje en el proyecto conozcan a Ruby y cuánto quieras confiar en un comportamiento poco intuitivo. 'nil.to_i' devolver 0 en lugar de generar una excepción no tiene mucho sentido lógicamente. ¿Cómo se puede obtener '0' de' nil'? No es como 'nil == 0' devuelve verdadero tampoco, pero' to_i' implica una equivalencia. –
@Ed S .: No, 'to_int' implica una equivalencia,' to_i' es tan laxo, realmente no implica mucho de nada. –
¡excelente respuesta! Siempre pasé por alto las largas conversiones, ahora puedo entenderlas y cómo se ajustan a la filosofía del rubí. –
se ajusta a la filosofía de la permisividad Rubí (a diferencia de, por ejemplo, el rigor de Python):
nil.to_i #=> 0
"".to_i #=> 0
"123hello".to_i #=> 123
"hello".to_i #=> 0
Para ser honesto, creo que esto es excesivamente permisiva. Como señaló Zabba, puede usar Kernel#Integer(string) para una conversión estricta.
to_i
significa "convertirme a un entero si puede".
Si quieres "si eres muy parecida a un entero, dame tu valor entero, sino da un NoMethodError", luego usa .to_int
.
Hay otra cuestión que se pregunta sobre la diferencia entre to_i
y to_int
, to_s
frente to_str
, etc. Avisadme si desea que encuentre por usted.
El protocolo de to_i
dice que debe devolver un Integer
y no debe lanzar 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 responden a to_int
. Si hizo responden a to_int
, eso sería, de hecho, "ilógico".
El hecho de que el protocolo diga que 'to_i' debe devolver un número entero no hace que este comportamiento sea lógico, simplemente lo hace conforme (dado que es mejor ser conformes aunque ilógico). –
Si usted sucede estar en rieles, puede utilizar try
:
nil.to_i # => 0
nil.try :to_i # => nil
- 1. nil || falso y falso || nil en ruby
- 2. Ruby Constructors and Exceptions
- 3. ruby-debug and pepino
- 4. En Ruby, ¿por qué una igualdad con nil ("Date.new == nil") devuelve nil?
- 5. Ruby check if nil before calling method
- 6. Ruby idioma para "foo.nil?? Nil: foo.to_i"?
- 7. ¿Por qué `a = a`` nil` en Ruby?
- 8. Ruby on Rails - request.env ['HTTP_REFERER'] devuelve nil
- 9. Can not Mod Zero?
- 10. mmap con/dev/zero
- 11. EsNulo y para Zero
- 12. Comprobación de nil en vista en Ruby on Rails
- 13. Prioridad del operador para And/&& en Ruby
- 14. Cómo usar AND en Ruby Regex
- 15. definido? método en Ruby and Rails
- 16. ¿Cómo se relacionan Ruby and Rails?
- 17. Clase Nil al usar la inyección de Ruby
- 18. la conversión de una cadena vacía en nil en Ruby
- 19. Signed zero linux vs windows
- 20. Uso de Oracle Zero Date
- 21. ¿Por qué el patrón OCaml `zero -> zero` parece coincidir con todo?
- 22. NSDocumentController currentDocument return nil
- 23. Form.Release + NIL
- 24. NSInvocación nil argumento
- 25. (OrElse and Or) and (AndAlso and And) - ¿Cuándo usar?
- 26. comportamiento `var = something rescue nil`
- 27. Diferencia entre .nil ?, .blank? y .empty?
- 28. Ubuntu 12 - cómo instalar Ruby and Rails correctamente
- 29. ¿Qué deben saber los desarrolladores de Ruby and Rails?
- 30. ¿Cómo puedo sangrar el código Ruby and Rails en Vim?
relacionadas: Usted puede usar 'n = entero (str)' si desea lanzar una excepción en caso de fallo. – Dogbert