Когда стоит использовать инклюзивные и эксклюзивные диапазоны? - PullRequest
0 голосов
/ 06 ноября 2018

Есть ли причина использовать инклюзивный диапазон вместо эксклюзивного или наоборот? Это лучше использовать это:

for i in 1..10
    puts i
end

или это:

for i in 1...11
    puts i
end

или это просто два способа представить одну и ту же вещь?

1 Ответ

0 голосов
/ 06 ноября 2018

Они не одно и то же.

(1..10).include?(10.5)
# => false
(1...11).include?(10.5)
# => true

(1..10).step(0.2).to_a
# => [1.0, 1.2, 1.4, ... 10.0]
(1...11).step(0.2).to_a
# => [1.0, 1.2, 1.4, ... 10.0, 10.2, 10.4, 10.6, 10.8] # (rounded for space)

И если вы ожидаете, что это будет выполнено в 50% случаев, вы совершаете (очень крошечную) ошибку:

if (0..0.5).include?(rand())

, что эквивалентно

if rand() <= 0.5

тогда как это истинные 50%:

if (0...0.5).include?(rand())
if rand() < 0.5

Как отмечает Кэри Свовеланд, двухточечный литерал создает диапазон, который описывает start <= x <= finish, тогда как трехточечный литерал создает диапазон с exclude_end, установленным на true, который описывает start <= x < finish.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...