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 #=> truey(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.injectviene de loEnumerablequeRangeincluye;Enumerableutiliza#each, queRangeimplementa . La lista generada porRange#eachnunca está contenida dentro delRangeobjeto en sí.Eso es correcto.
La sintaxis de tres puntos es menos común, pero es más agradable que
(1..10-1).to_afuente
..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...bexcluye el valor final, mientras quea..bincluye el valor final.Cuando se trabaja con números enteros, se
a...bcomporta comoa..b-1.Pero realmente los rangos difieren en una recta numérica real .
Puede ver esto al incrementar en pasos fraccionarios.
fuente
a&bson 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