2013-10-31 2 views
4
letters = ["a", "b", "c", "d", "e"] 
first, *second = letters 
first # => "a" 
second # => "["b", "c", "d", "e"] 

나는 이것이 무엇을하는지 이해하지만, 이것에 관해서는 머리를 얻을 수 없다. 이것은 기본적으로 루비 마술인가? splat 연산자로 이러한 유형의 할당을 지원하는 다른 프로그래밍 언어는 생각할 수 없습니다.Ruby에서 splat 연산자로이 병렬 할당이 어떻게 작동합니까?

답변

2

기본적으로 배열을 생성한다고 생각합니다. 다음 예를 살펴 보겠습니다 :

> *foo = 1 
> foo 
=> [1] 

그래서 여기 *second 배열을 만들고 letters[1..-1]에서 모든 요소를 ​​추출합니다. 그렇지 않으면 letters[1]이라는 "b"second 변수에 할당합니다.

나는 누군가가 더 나은 설명을 내놓을 것이라고 확신하지만 기본적인 생각은 여기에있다.

splat operator에 대한 자세한 내용입니다.

3

이것은 함수형 언어에서 매우 일반적이므로 루비는 혼자가 아닙니다. 항목 목록이 있고이를 headtail으로 구분하여 목록의 첫 번째 요소에 대한 연산을 수행 할 수 있습니다.

이것은 또한 작동합니다

letters = ["a", "b", "c", "d", "e"] 
first, *middle, last = letters 

을 Clojure의 같은 함수형 언어에서, 당신은 같은 것을 볼 것이다 :

(first '(1 2 3)) => 1 
(rest '(1 2 3)) => (2 3) 
+0

FP에 대한 참조는 +1 할 수 있습니다. 그러나 FP에서는 목록을 연결하므로 머리와 꼬리를 추출하는 것이 값싼 작업입니다. 배열을 사용하면 불행히도 그렇게 저렴하지 않습니다 ... – tokland

2

이것은 훌륭한 세부 사항 모든 "magical properties"을에 설명되어 여기에 매우 흥미로운 일을

예 :

a, *b, c = [1, 2, 3, 4, 5] 
a # => 1 
b # => [2, 3, 4] 
C# => 5 

a, (b, c) = [2,[2,[6,7]]] 
a 
=> 2 
b 
=> 2 
c 
=> [6, 7] 
관련 문제