2011-09-26 2 views
8

나는 그들이이해 루비 플랫

splat1 = *(1..9) # splat1 = [1, 2, 3, 4, 5, 6, 7, 8, 9] 
splat2 = [*1..9] # splat2 = [1, 2, 3, 4, 5, 6, 7, 8, 9] 

그러나 상황이 이상한 얻을 같은 방식으로 작동 변수에 할당 할 경우 *(1..9)[*1..9]

의 차이를 이해하기 위해 노력하고있어 때를 *(1..9)[*1..9]을 직접 사용해보십시오.

*(1..9).map{|a| a.to_s} # syntax error, unexpected '\n', expecting tCOLON2 or '[' or '.' 
[*1..9].map{|a| a.to_s} # ["1", "2", "3"...] 

나는 운영자의 입장에서 문제의 일부를 추측하고 있습니까? 그러나 나는 무슨 일이 일어나고 있는지 정확히 알지 못한다. *(1..9)을 사용할 수없는 이유는 무엇입니까? [*1..9]을 사용할 수 있습니까?

+1

'P는 * (1..9) .MAP {| A | a.to_s}'ok ok – Bohdan

+0

마찬가지로,'([1..9]). map'도 잘 동작합니다; 그러나 명백한'to_a' 메쏘드가 더 간결하고 본질적으로 간결하다고 생각합니다. – maerics

답변

8

나는 문제는 splat가 lvalue로만 사용될 수 있다고 믿습니다. 즉, 뭔가가 받아 들여야 만한다는 것입니다.

예를 들어 *(1..9).map의 예제는 표시기에 수신자가 없기 때문에 [*1..9].map이 작동하고 있기 때문에 작성중인 배열이 표시기이기 때문에 작동하지 않습니다.

UPDATE : 이 스레드 (특히 마지막 코멘트)에 대한 몇 가지 추가 정보 : Where is it legal to use ruby splat operator?