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

时间:2012-03-13 19:35:14

标签: ruby syntax range

我刚刚开始学习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中进行了一些测试,似乎表明..包含两个端点,而...仅包括下限但不包括上限。这是对的吗?

5 个答案:

答案 0 :(得分:137)

documentation for Range 说:

  

使用..构建的范围包括从开始到结束。使用...创建的内容排除了结束值。

所以a..b就像a <= x <= b,而a...b就像a <= x < b


注意,虽然整数范围上的to_a给出了一个整数集合,但一个范围不是一组值,而只是一对开始/结束值:< / p>

(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’s section on Ranges。感谢@MarkAmery(see below)注意此更新。

答案 1 :(得分:5)

这是正确的。

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

更好

答案 2 :(得分:3)

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

答案 3 :(得分:1)

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

但实际上real number line的范围不同。

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

答案 4 :(得分:-4)

..和...表示范围。

只需在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
相关问题