Acabei de começar a aprender Ruby e Ruby on Rails e me deparei com um código de validação que usa intervalos:
validates_inclusion_of :age, :in => 21..99
validates_exclusion_of :age, :in => 0...21, :message => "Sorry, you must be over 21"
A princípio, pensei que a diferença estava na inclusão de endpoints, mas nos documentos da API que examinei, não parecia importar se era ..
ou ...
: sempre incluía os endpoints.
No entanto, fiz alguns testes no irb e pareceu indicar que ..
inclui ambos os pontos de extremidade, enquanto ...
incluía apenas o limite inferior, mas não o superior. Isso está correto?
(1..10).include? 10 #=> true
e(1...10).include? 10 #=> false
(a..b) != (a...(b+1))
apesar de suas representações de array serem iguais (quando a, b ∈ ℤ). Eu atualizei minha resposta um pouco para expandir isso.inject
vem deEnumerable
queRange
inclui;Enumerable
utiliza#each
, queRange
implementa . A lista gerada porRange#each
nunca está contida noRange
próprio objeto.Está correto.
A sintaxe de ponto triplo é menos comum, mas é melhor do que
(1..10-1).to_a
fonte
..
é mais comum e, portanto, menos é preferido para isso?(a..b-1) != (a...b)
, embora essa resposta implique que sim.Os documentos da API agora descrevem esse comportamento:
Em outras palavras:
fonte
a...b
exclui o valor final, enquantoa..b
inclui o valor final.Ao trabalhar com inteiros,
a...b
se comporta comoa..b-1
.Mas realmente os intervalos diferem em uma reta de número real .
Você pode ver isso ao incrementar em etapas fracionárias.
fonte
a
&b
forem inteiros, os intervalos são diferentes. Somente quando cada um é convertido em uma matriz eles são iguais. Existe um contra-exemplo específico na resposta aceita... e ... denotam um intervalo.
Basta ver no irb:
fonte