double * (splat) 연산자의 기능


214

이렇게 선언 된 함수를 보셨습니까?

def foo a, **b
  ...
end

하나 *는 스 플랫 연산자 라는 것을 알고 있습니다. 무슨 **뜻입니까?

답변:


373

Ruby 2.0은 키워드 인수를 도입했으며 키워드 인수와 **같은 역할 *을합니다. 키 / 값 쌍이있는 해시를 반환합니다.

이 코드의 경우 :

def foo(a, *b, **c)
  [a, b, c]
end

데모는 다음과 같습니다.

> foo 10
=> [10, [], {}]
> foo 10, 20, 30
=> [10, [20, 30], {}]
> foo 10, 20, 30, d: 40, e: 50
=> [10, [20, 30], {:d=>40, :e=>50}]
> foo 10, d: 40, e: 50
=> [10, [], {:d=>40, :e=>50}]

44
이것은 질문에 완벽하게 대답하지만 약간의 부록이 있습니다. 전달하는 배열에서 splat 연산자를 사용할 수있는 것처럼 double splat도 해시에서 사용할 수 있습니다. 경우 opts = {d: 40, e: 50}다음 foo 10, opts, f: 60할당합니다 {f: 60}c, 반면이 foo 10, **opts, f: 60할당합니다 {d: 40, e: 50, f: 60}. 두 번째 효과를 얻으려면 이전 merge에 배열을 명시 적으로 지정해야합니다.
brymck

나는이 방법에 대한 옵션 해시 매개 변수를 설정하는 데 유용 생각할 겁니다
bigpotato

키워드 인수와 키워드 표시를 혼합하는 경우 키워드 표시는 키워드 인수 뒤에 와야합니다.
MrMesees

43

이것은 Ruby 2.0부터 사용할 수 있는 이중 스 플랫 연산자입니다.

모든 키워드 인수를 캡처합니다 (루비 언어의 일부가되기 전에 키워드 인수를 에뮬레이트하는 관용적 방법 인 간단한 해시 일 수도 있음).

def my_method(**options)
  puts options.inspect
end

my_method(key: "value")

위의 코드 {key:value}는 콘솔에 인쇄 됩니다.

단일 splat 연산자가 모든 일반 인수를 캡처하는 것처럼 배열 대신 해시 를 얻습니다 .

실제 예 :

예를 들어 Rails에서 cycle메소드는 다음과 같습니다.

def cycle(first_value, *values)
  options = values.extract_options!
  # ...
end

이 메소드는 다음과 같이 호출 할 수 있습니다 cycle("red", "green", "blue", name: "colors").

이는 매우 일반적인 패턴입니다. 인수 목록을 승인하고 마지막 인수는 옵션 해시입니다. 예를 들어 ActiveSupport 's를 사용하여 추출 할 수 있습니다 extract_options!.

Ruby 2.0에서는 다음 방법을 단순화 할 수 있습니다.

def cycle(first_value, *values, **options)
  # Same code as above without further changes!
end

이미 ActiveSupport를 사용하고 있지만 일반 Ruby의 경우 코드가 상당히 간결 해집니다.


20

또한 다음과 같이 발신자 측에서 사용할 수 있습니다.

def foo(opts); p opts end
bar = {a:1, b:2}

foo(bar, c: 3)
=> ArgumentError: wrong number of arguments (given 2, expected 1)

foo(**bar, c: 3)
=> {:a=>1, :b=>2, :c=>3}

5
와우, 이중 표시는 ES6의 객체 확산 연산자와 유사합니다.
mpoisot 2016 년

1
고마워, 내가 찾던 확인이야.
Qortex
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.