Ich habe gerade angefangen, Ruby und Ruby on Rails zu lernen, und bin auf Validierungscode gestoßen, der Bereiche verwendet:
validates_inclusion_of :age, :in => 21..99
validates_exclusion_of :age, :in => 0...21, :message => "Sorry, you must be over 21"
Zuerst dachte ich, der Unterschied liege in der Einbeziehung von Endpunkten, aber in den API-Dokumenten, die ich mir angesehen habe, schien es egal zu sein, ob es sich um Endpunkte handelte ..
oder nicht ...
: Es enthielt immer die Endpunkte.
Ich habe jedoch einige Tests in irb durchgeführt und es schien darauf hinzudeuten, dass ..
beide Endpunkte enthalten sind, während ...
nur die Untergrenze, nicht aber die Obergrenze enthalten ist. Ist das richtig?
(1..10).include? 10 #=> true
und(1...10).include? 10 #=> false
(a..b) != (a...(b+1))
trotz ihrer Array-Darstellungen gleich (wenn a, b ∈ ∈). Ich habe meine Antwort ein wenig aktualisiert, um das zu erweitern.inject
kommt vonEnumerable
denenRange
beinhaltet;Enumerable
nutzt#each
, wasRange
implementiert . Die von generierte ListeRange#each
ist niemals imRange
Objekt selbst enthalten.Das ist richtig.
Die Triple-Dot-Syntax ist weniger verbreitet, aber besser als
(1..10-1).to_a
quelle
..
es häufiger vorkommt und daher weniger dafür bevorzugt wird.(a..b-1) != (a...b)
diese Antwort impliziert , dass dies der Fall ist.Die API-Dokumente beschreiben nun dieses Verhalten:
Mit anderen Worten:
quelle
a...b
schließt den Endwert aus, währenda..b
enthält den Endwert.Verhält sich beim Arbeiten mit ganzen Zahlen
a...b
wie folgta..b-1
.Aber wirklich unterscheiden sich die Bereiche auf einer reellen Zahlenlinie .
Sie können dies sehen, wenn Sie in Bruchschritten inkrementieren.
quelle
a
&b
ganze Zahlen sind, sind die Bereiche unterschiedlich. Nur wenn jedes in ein Array konvertiert wird, sind sie gleich. In der akzeptierten Antwort ist ein bestimmtes Gegenbeispiel vorhanden... und ... bezeichnen einen Bereich.
Sieh es einfach in irb:
quelle