codememo

이중 *(스플랫) 연산자는 무엇을 합니까?

tipmemo 2023. 6. 2. 20:32
반응형

이중 *(스플랫) 연산자는 무엇을 합니까?

이렇게 선언된 함수를 본 적이 있습니까?

def foo a, **b
  ...
end

나는 싱글 앨범이*는 스플랫 연산자입니다.무엇인가.**비열한?

루비 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}]

이것은 루비 2.0 이후로 사용 가능한 이중 스플랫 연산자입니다.

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

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

my_method(key: "value")

위의 코드 인쇄{key:value}콘솔에

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

실제 사례:

예를 들어 레일에서cycle방법은 다음과 같습니다.

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

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

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

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

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

이미 액티브 서포트를 사용하고 있다면 그것은 작은 개선에 불과하지만 일반 루비의 경우 코드가 상당히 간결해집니다.

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

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}

당신의 경우, 위의 답변은 정확합니다.

그러나 이중 스플랫 연산자는 산술 연산에도 루비 언어로 사용할 수 있습니다.예를들면,x^y라고 쓸 수 있습니다.x**y.

자세한 내용은 이 스택 오버 질문을 참조하십시오.

언급URL : https://stackoverflow.com/questions/18289152/what-does-a-double-splat-operator-do

반응형