![](/img/trans.png)
[英]Difference between 3-dot-range operator and 2-dot-range operator in flip flop ruby
[英]Difference between '..' (double-dot) and '...' (triple-dot) in range generation?
我剛剛開始學習 Ruby 和 Ruby on Rails,遇到了使用范圍的驗證代碼:
validates_inclusion_of :age, :in => 21..99
validates_exclusion_of :age, :in => 0...21, :message => "Sorry, you must be over 21"
起初我認為區別在於端點的包含,但在我查看的 API 文檔中,它是..
還是...
似乎並不重要:它總是包含端點。
但是,我在 irb 中做了一些測試,它似乎表明..
包括兩個端點,而...
只包括下限而不包括上限。 這個對嗎?
Range †的文檔是這樣說的:
使用
..
構建的范圍從頭到尾都包含在內。 使用...
創建的那些不包括最終值。
所以a..b
就像a <= x <= b
,而a...b
就像a <= x < b
。
請注意,雖然整數范圍上的to_a
給出了整數的集合,但范圍不是一組值,而只是一對開始/結束值:
(1..5).include?(5) #=> true
(1...5).include?(5) #=> false
(1..4).include?(4.1) #=> false
(1...5).include?(4.1) #=> true
(1..4).to_a == (1...5).to_a #=> true
(1..4) == (1...5) #=> false
†文檔過去不包含此內容,而是需要閱讀Pickaxe 的 Ranges 部分。 感謝@MarkAmery(見下文)注意到此更新。
那是對的。
1.9.3p0 :005 > (1...10).to_a
=> [1, 2, 3, 4, 5, 6, 7, 8, 9]
1.9.3p0 :006 > (1..10).to_a
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
三點語法不太常見,但比(1..10-1).to_a
更好
API 文檔現在描述了這種行為:
使用
..
構建的范圍從頭到尾都包含在內。 使用...
創建的那些不包括最終值。
換句話說:
2.1.3 :001 > ('a'...'d').to_a
=> ["a", "b", "c"]
2.1.3 :002 > ('a'..'d').to_a
=> ["a", "b", "c", "d"]
a...b
不包括結束值,而a..b
包括結束值。
使用整數時, a...b
表現為a..b-1
。
>> (-1...3).to_a
=> [-1, 0, 1, 2]
>> (-1..2).to_a
=> [-1, 0, 1, 2]
>> (-1..2).to_a == (-1...3).to_a
=> true
但實際上范圍在實數線上有所不同。
>> (-1..2) == (-1...3)
=> false
您可以在以小數步遞增時看到這一點。
>> (-1..2).step(0.5).to_a
=> [-1.0, -0.5, 0.0, 0.5, 1.0, 1.5, 2.0]
>> (-1...3).step(0.5).to_a
=> [-1.0, -0.5, 0.0, 0.5, 1.0, 1.5, 2.0, 2.5]
.. 和 ... 表示一個范圍。
只需在 irb 中查看:
ruby-1.9.2-p290 :032 > (1...2).each do puts "p" end
p
=> 1...2
ruby-1.9.2-p290 :033 > (1..2).each do puts "p" end
p
p
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.