Разница между '..'(двойная точка) и '...' (тройная точка) в поколении диапазона?
Я только начал изучать 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 ответов:
The документация для диапазона† говорит:
диапазоны, построенные с помощью
..
выполнить от начала до конца включительно. Те, которые созданы с помощью...
исключает конечное значение.так
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
†документы, используемые, чтобы не включать это, вместо того, чтобы требовать чтения раздел кирки на диапазонах. Спасибо @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]