范围生成中“..”(双点)和“...”(三点)之间的区别?

问题描述 投票:0回答:5

我刚刚开始学习 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 中做了一些测试,似乎表明

..
包括两个端点,而
...
只包括下限而不包括上限。这是正确的吗?

ruby syntax range
5个回答
213
投票

范围文档是这样说的:

使用

..
构建的范围从开始到结束(包含在内)。使用
...
创建的内容不包括最终值。

所以

a..b
就像 [a, b] 又名
a <= x <= b
,而
a...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 关于范围的部分][2]。感谢@MarkAmery([见下文][3])注意到此更新。

10
投票

这是正确的。

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

更好

7
投票

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"] 

2
投票

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]

-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
© www.soinside.com 2019 - 2024. All rights reserved.