[ruby] 범위 생성에서 ‘..'(이중 점)과 ‘…'(삼중 점)의 차이점은 무엇입니까?

방금 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"

첫번째 I에서 차이가 엔드 포인트의 포함에 줄 알았는데,하지만 난에 보였다 API 문서에, 그것이 여부 상관하는 것 같지 않았어요 .....: 그것은 항상 엔드 포인트를 포함.

그러나 irb에서 몇 가지 테스트를 수행했으며 ..두 끝점을 모두 ...포함하고 하한은 포함하고 상한은 포함하지 않는 것으로 나타났습니다 . 이 올바른지?



답변

범위에 대한 문서는 이 말한다 :

..처음부터 끝까지 실행을 사용하여 구성된 범위 입니다. 사용하여 생성 된 항목 ...은 최종 값 을 제외합니다.

그래서 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

이것을 포함하지 않았던 문서는 대신 Ranges에 대한 Pickaxe 섹션을 읽어야합니다 . 이 업데이트에 주목 해 주신 @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 문서에서이 동작을 설명합니다.

..처음부터 끝까지 실행을 사용하여 구성된 범위 입니다. 사용하여 생성 된 항목 ...은 최종 값 을 제외합니다.

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


답변

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]


답변

.. 및 …는 범위를 나타냅니다.

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


답변