2013-11-26 3 views
0

('a'..'z').each { |a| puts a}을 입력하면 데이터 유형 수준에서 정확히 무슨 일이 벌어지고 있습니까? 나는 그것이 인쇄 될 때, 그것은 개별 문자열 인 것을 알고 있지만 'a'..'z'은 독자적으로 무엇입니까? 배열입니까?어떤 종류의 데이터 유형 ('a'.. 'z')입니까?

답변

6

그것은 Range의 :

('a'..'z').class 
=> Range 

당신은 ('a'..'z').to_a으로 배열로 변환 할 수 있습니다.

3

그것은 Range입니다 :

irb(main):001:0> ('a'..'z').class 
=> Range 
0

귀하의 질문의 두 번째 부분에 대답하기 위해, 'a'..'z'Range이다. 다른 사람이 말한 것처럼 :

('a'..'z').class # => Range 

데이터 유형 수준에서 무슨 일이 일어나고 있는지에 대한 질문의 첫 부분에 대답하기 위해, 범위는 여러 가지 방법으로 배열 같다. 글자를 범위 끝점으로 사용할 때 범위에는 배열과 마찬가지로 개별 요소가 포함됩니다. 즉, 'a'에서 'z'까지의 모든 문자를 포함합니다. 정수를 사용할 때도 마찬가지입니다. 1..51, 2, 3, 45을 포함합니다. Array class처럼 Range에는 Enumerable module이 포함되어 있으므로 each과 같은 여러 가지 방법이 있습니다. 귀하의 예에서는 each이 범위 구성원을 반복합니다.

범위는 몇 가지 중요한 방식으로 배열과 다릅니다.

먼저 Float 값을 끝점으로 사용할 수 있습니다. 당신이 그와 같은 범위를 반복 할 때, 그것이 오류가 발생합니다

(1.1..5).class # => Range 

: 예를 들어, 1.1..5는 유효 범위 그 범위의 요소가 아니기 때문에

(1.1..5).each { |a| puts a } # => TypeError: can't iterate from Float 

입니다 이산. 범위는 연속입니다.

.. 대신 ...을 사용하여 두 번째 끝점을 제외하는 방식으로 정의 할 수있는 범위도 배열과 다릅니다. 예를 들어 'a'...'z'에는 'a'에서 'y'까지의 문자가 포함됩니다. 'z'가이 범위에 있지 않습니다. 이를 증명하기 위해 ('a'...'z').each { |a| puts a }을 시도 할 수 있습니다.

관련 문제