스플랫과 튜플
스플랫과 튜플 (Splats and tuples)
스플랫 매개변수(*)를 쓰면 메서드가 가변 개수의 인자를 받을 수 있습니다. 스플랫은 한 번만, 그리고 어느 위치에든 등장할 수 있어요:
def sum(*elements)
total = 0
elements.each do |value|
total += value
end
total
end
sum 1, 2, 3 # => 6
sum 1, 2, 3, 4.5 # => 10.5
전달된 인자들은 메서드 본문에서 Tuple이 됩니다:
# elements is Tuple(Int32, Int32, Int32)
sum 1, 2, 3
# elements is Tuple(Int32, Int32, Int32, Float64)
sum 1, 2, 3, 4.5
스플랫 매개변수 뒤에 오는 인자는 명명 인자(named argument)로만 전달할 수 있어요:
def sum(*elements, initial = 0)
total = initial
elements.each do |value|
total += value
end
total
end
sum 1, 2, 3 # => 6
sum 1, 2, 3, initial: 10 # => 16
스플랫 매개변수 뒤의 기본값이 없는 매개변수는 필수 명명 매개변수가 됩니다:
def sum(*elements, initial)
total = initial
elements.each do |value|
total += value
end
total
end
sum 1, 2, 3 # Error, missing argument: initial
sum 1, 2, 3, initial: 10 # => 16
서로 다른 필수 명명 매개변수를 가진 두 메서드는 서로 오버로드(overload)됩니다:
def foo(*elements, x)
1
end
def foo(*elements, y)
2
end
foo x: "something" # => 1
foo y: "something" # => 2
스플랫 매개변수는 이름 없이 둘 수도 있는데, "이 뒤로는 명명 매개변수가 온다"는 뜻입니다:
def foo(x, y, *, z)
end
foo 1, 2, 3 # Error, wrong number of arguments (given 3, expected 2)
foo 1, 2 # Error, missing argument: z
foo 1, 2, z: 3 # OK
튜플 스플랫 (Splatting a tuple)
*를 쓰면 Tuple을 메서드 호출로 스플랫할 수 있어요:
def foo(x, y)
x + y
end
tuple = {1, 2}
foo *tuple # => 3
더블 스플랫과 명명 튜플 (Double splats and named tuples)
더블 스플랫(**)은 다른 매개변수와 일치하지 않은 명명 인자를 받아냅니다. 이 매개변수의 타입은 NamedTuple이에요:
def foo(x, **other)
# Return the captured named arguments as a NamedTuple
other
end
foo 1, y: 2, z: 3 # => {y: 2, z: 3}
foo y: 2, x: 1, z: 3 # => {y: 2, z: 3}
명명 튜플 더블 스플랫 (Double splatting a named tuple)
**를 쓰면 NamedTuple을 메서드 호출로 스플랫할 수 있어요:
def foo(x, y)
x - y
end
tuple = {y: 3, x: 10}
foo **tuple # => 7
출처: Crystal 공식 문서
더 알아보기 (Learn more)
- 튜플 리터럴 — 튜플 만들기
- NamedTuple 리터럴 — 이름 붙은 튜플
- 기본값·명명 인자·스플랫·오버로딩 — 인자 처리 종합