2017-02-21 13 views
5

루비에서 간단한 작업을하는 이상한 일이 생겼습니다. 난 그냥 각각의 방법으로 알파벳을 반복 할 만 반복 실행에 첫째가는이의루비가 각각의 반복기를 처음 실행하는 이유는 무엇입니까?

alfawit = ("a".."z") 
puts "That's an alphabet: \n\n #{ alfawit.each { |litera| puts litera } } " 

이 코드 결과 : (약칭 함)

a 
b 
c 
⋮ 
x 
y 
z 
That's an alphabet: 

a..z 

가 같이 작동 왜 어떤 아이디어 이게 뭐지? 내가 잘못 했어?

미리 감사드립니다.

+0

예상되는 결과는 무엇입니까? – Stefan

+0

Ursus가 "That 's an alphabet"을 쓰고 알파벳을 나열한 후에 알파벳을 나열하십시오. 나는 내가했던 것처럼 반복을 중첩 할 수 있다고 생각했다. – Michalko

답변

5

고정 문자열 앞에 실행되는 문자열 리터럴에서 each 호출이 보간되기 때문에. 또한 eachEnumerable을 반환하며 실제로 인쇄합니다. 보십시오이 하나

alfawit = ("a".."z") 
puts "That's an alphabet: \n\n" 
alfawit.each { |litera| puts litera } 

또는

puts "That's an alphabet: \n\n" 
("a".."z").each { |litera| puts litera } 

당신이 원하는 그러나 당신이에 보간 부분을 추출 할 경우이 방법으로

alfawit = ("a".."z") 
puts "That's an alphabet: \n\n#{alfawit.to_a.join("\n")}" 
+1

감사합니다. 나는 며칠 동안 그렇게 단순하다는 것을 이해하기 위해 고심하고있었습니다. – Michalko

+1

나의 기쁨 선생님 :) – Ursus

3

당신은 쉽게 무슨 일이 일어나고 있는지 볼 수있는 경우 보간을 사용할 수 있습니다 변수 :

alfawit = ("a".."z") 
foo = alfawit.each { |litera| puts litera } 
puts "That's an alphabet: \n\n #{ foo } " 

두 번째 줄에서 문제가 발생했습니다. each은 범위의 각 요소에 대해 블록을 호출 한 다음 수신기를 반환하므로 fooalfawit이됩니다.

은 여기서 원하는 결과를 얻기 위해 또 다른 방법 :

alfawit = "a".."z" 
puts "That's an alphabet:", alfawit.to_a 

puts 출력 새로운 행의 각 인자이지만 어레이 인수를 들면, 새로운 라인에 각 소자 출력한다. 결과 : 마찬가지로

That's an alphabet: 
a 
b 
c 
⋮ 
x 
y 
z 

, 당신은으로 범위를 설정 할 수있는 argument list*를 통해 : 동등의

alfawit = "a".."z" 
puts "That's an alphabet:", *alfawit 

:

puts "That's an alphabet:", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"