簡體   English   中英

范圍生成中“..”(雙點)和“...”(三點)之間的區別?

[英]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 文檔現在描述了這種行為:

使用..構建的范圍從頭到尾都包含在內。 使用...創建的那些不包括最終值。

-- http://ruby-doc.org/core-2.1.3/Range.html

換句話說:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM