Acabo de comenzar a aprender Ruby y Ruby on Rails y encontré un código de validación que usa rangos:
validates_inclusion_of :age, :in => 21..99
validates_exclusion_of :age, :in => 0...21, :message => "Sorry, you must be over 21"
Al principio pensé que la diferencia estaba en la inclusión de puntos finales, pero en los documentos de API que miré, no parecía importar si era ..
o ...
: siempre incluía los puntos finales.
Sin embargo, hice algunas pruebas en irb y pareció indicar que ..
incluye ambos puntos finales, mientras que ...
solo incluía el límite inferior pero no el superior. ¿Es esto correcto?
(1..10).include? 10 #=> true
y(1...10).include? 10 #=> false
(a..b) != (a...(b+1))
pesar de que sus representaciones de matriz son iguales (cuando a, b ∈ ℤ). Actualicé un poco mi respuesta para ampliar eso.inject
viene de loEnumerable
queRange
incluye;Enumerable
utiliza#each
, queRange
implementa . La lista generada porRange#each
nunca está contenida dentro delRange
objeto en sí.Eso es correcto.
La sintaxis de tres puntos es menos común, pero es más agradable que
(1..10-1).to_a
fuente
..
es más común y, por lo tanto, se prefiere menos para ello.(a..b-1) != (a...b)
, aunque esta respuesta implica que lo son.Los documentos de la API ahora describen este comportamiento:
En otras palabras:
fuente
a...b
excluye el valor final, mientras quea..b
incluye el valor final.Cuando se trabaja con números enteros, se
a...b
comporta comoa..b-1
.Pero realmente los rangos difieren en una recta numérica real .
Puede ver esto al incrementar en pasos fraccionarios.
fuente
a
&b
son números enteros, los rangos son diferentes. Solo cuando cada uno se convierte en una matriz son iguales. Existe un contraejemplo específico en la respuesta aceptada... y ... denotan un rango.
Solo míralo en irb:
fuente