이중 *(스플랫) 연산자는 무엇을 합니까?
이렇게 선언된 함수를 본 적이 있습니까?
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
'codememo' 카테고리의 다른 글
| 아이폰에서 "홈 화면에 추가"를 위한 자바스크립트? (0) | 2023.06.02 |
|---|---|
| Git의 단계별 변경에서 "이전 모드 100755 new mode 100644"라고 적힌 파일을 제거하려면 어떻게 해야 합니까? (0) | 2023.06.02 |
| 날짜 시간과 시간의 차이(Ruby) (0) | 2023.06.02 |
| dyld'__deld_with_deld_with_deld:오류 메시지 없음 (0) | 2023.05.28 |
| 문자열 또는 이진 데이터가 잘립니다.전표가 종료되었습니다. (0) | 2023.05.28 |