Default parameter values and named arguments

Default parameter values and named arguments (기본 인자값과 이름 있는 인자)

메서드를 설계하다 보면 "이 인자는 안 넘겨도 괜찮게 하고 싶다"거나 "인자가 많아서 순서를 헷갈리지 않게 하고 싶다"는 요구가 생겨요. Crystal은 이런 상황을 위해 기본 인자값이름 있는 인자(named arguments) 두 가지를 모두 지원해요.

출처: Crystal 공식 문서 - Default parameter values and named arguments

본문

기본 인자값

메서드는 마지막 인자들에 기본값을 지정할 수 있어요.

class Person
  def become_older(by = 1)
    @age += by
  end
end

john = Person.new "John"
john.age # => 0

john.become_older
john.age # => 1

john.become_older 2
john.age # => 3

become_older를 인자 없이 호출하면 by가 기본값인 1이 되어 @age가 1만큼 늘어나요. 반대로 2를 넘기면 그 값만큼 늘어나죠. 인자를 지정하지 않으면 기본값, 지정하면 그 값이 쓰여요.

이름 있는 인자

모든 인자는 위치뿐 아니라 이름으로도 지정할 수 있어요.

john.become_older by: 5

인자가 많을 때는 호출에서 이름의 순서가 중요하지 않아요. 필요한 인자만 모두 채워지면 순서는 상관없어요.

def some_method(x, y = 1, z = 2, w = 3)
  # do something...
end

some_method 10                   # x: 10, y: 1, z: 2, w: 3
some_method 10, z: 10            # x: 10, y: 1, z: 10, w: 3
some_method 10, w: 1, y: 2, z: 3 # x: 10, y: 2, z: 3, w: 1
some_method y: 10, x: 20         # x: 20, y: 10, z: 2, w: 3

some_method y: 10 # Error, missing argument: x

마지막 줄처럼 필수 인자인 x가 빠지면 컴파일 에러가 나요. 이름 있는 인자를 쓰면 인자들의 의도를 코드에서 바로 드러낼 수 있어서 가독성이 좋아져요.

메서드가 스플랫(splat) 인자를 지정하는 경우에는(다음 절에서 설명해요) 위치 인자 자리에 이름 있는 인자를 쓸 수 없어요. 인자가 어떻게 매칭되는지 이해하기 너무 어려워지기 때문이고, 그런 상황에서는 위치 인자가 더 추론하기 쉽기 때문이에요.

더 알아보기