Je viens de commencer à apprendre Ruby et Ruby on Rails et suis tombé sur un code de validation qui utilise des plages:
validates_inclusion_of :age, :in => 21..99
validates_exclusion_of :age, :in => 0...21, :message => "Sorry, you must be over 21"
Au début, je pensais que la différence résidait dans l'inclusion des points de terminaison, mais dans les documents sur l'API que j'ai examinés, peu importe que ce soit le cas ..
ou ...
: cela incluait toujours les points de terminaison.
Cependant, j'ai fait quelques tests dans irb et cela semblait indiquer que cela ..
inclut les deux points de terminaison, tout en n'incluant ...
que la limite inférieure mais pas la limite supérieure. Est-ce correct?
(1..10).include? 10 #=> true
et(1...10).include? 10 #=> false
(a..b) != (a...(b+1))
malgré que leurs représentations de tableau soient égales (quand a, b ∈ ℤ). J'ai mis à jour ma réponse un peu pour développer cela.inject
vient deEnumerable
quiRange
comprend;Enumerable
utilise#each
, quiRange
met en œuvre . La liste générée parRange#each
n'est jamais contenue dans l'Range
objet lui-même.C'est correct.
La syntaxe à trois points est moins courante, mais plus agréable que
(1..10-1).to_a
la source
..
c'est plus courant et donc moins est préféré pour cela?(a..b-1) != (a...b)
, bien que cette réponse implique qu'ils le sont.La documentation de l'API décrit maintenant ce comportement:
En d'autres termes:
la source
a...b
exclut la valeur finale, tandis quea..b
comprend la valeur finale.Lorsque vous travaillez avec des entiers,
a...b
se comporte commea..b-1
.Mais vraiment, les plages diffèrent sur une droite numérique réelle .
Vous pouvez le voir lors de l'incrémentation par étapes fractionnaires.
la source
a
&b
sont des entiers, les plages sont différentes. Ce n'est que lorsque chacun est converti en tableau qu'ils sont identiques. Un contre-exemple spécifique existe dans la réponse acceptée... et ... désignent une plage.
Il suffit de le voir dans irb:
la source