Saya baru saja mulai mempelajari Ruby dan Ruby on Rails dan menemukan kode validasi yang menggunakan rentang:
validates_inclusion_of :age, :in => 21..99
validates_exclusion_of :age, :in => 0...21, :message => "Sorry, you must be over 21"
Awalnya saya pikir perbedaannya ada pada penyertaan titik akhir, tetapi dalam dokumen API yang saya lihat, tampaknya tidak masalah apakah itu ..
atau ...
: itu selalu menyertakan titik akhir.
Namun, saya melakukan beberapa pengujian di irb dan tampaknya menunjukkan bahwa itu ..
mencakup kedua titik akhir, sementara ...
hanya menyertakan batas bawah tetapi tidak di atas. Apakah ini benar?
(1..10).include? 10 #=> true
dan(1...10).include? 10 #=> false
(a..b) != (a...(b+1))
meskipun representasi array mereka sama (bila a, b ∈ ℤ). Saya telah memperbarui jawaban saya sedikit untuk memperluasnya.inject
berasal dariEnumerable
yangRange
meliputi;Enumerable
memanfaatkan#each
, yangRange
mengimplementasikan . Daftar yang dibuat olehRange#each
tidak pernah berada di dalamRange
objek itu sendiri.Itu betul.
Sintaks tiga titik kurang umum, tetapi lebih bagus dari
(1..10-1).to_a
sumber
..
lebih umum dan dengan demikian kurang disukai untuk itu?(a..b-1) != (a...b)
, meskipun jawaban ini menyiratkan demikian.Dokumen API sekarang menjelaskan perilaku ini:
Dengan kata lain:
sumber
a...b
tidak termasuk nilai akhir, sementaraa..b
memasukkan nilai akhir.Saat bekerja dengan bilangan bulat,
a...b
berperilaku sebagaia..b-1
.Tapi sebenarnya rentangnya berbeda pada garis bilangan real .
Anda dapat melihat ini saat menaikkan dalam langkah pecahan.
sumber
a
&b
adalah bilangan bulat, rentangnya berbeda. Hanya ketika masing-masing diubah menjadi array mereka sama. Contoh balasan tertentu ada dalam jawaban yang diterima... dan ... menunjukkan rentang.
Lihat saja di irb:
sumber