수색…


비고

키워드 인수 는 Ruby 2.0에서 도입되었으며 필수 키워드 인수가 추가 된 Ruby 2.1에서 향상되었습니다.

키워드 인수를 사용하는 간단한 메소드는 다음과 같습니다.

def say(message: "Hello World")
  puts message
end

say
# => "Hello World"

say message: "Today is Monday"
# => "Today is Monday"

키워드 인수가없는 동일한 메소드는 다음과 같았습니다.

def say(message = "Hello World")
  puts message
end

say
# => "Hello World"

say "Today is Monday"
# => "Today is Monday"
2.0

이전 Ruby 버전에서 Hash 매개 변수를 사용하여 키워드 인수를 시뮬레이션 할 수 있습니다. 이것은 여전히 ​​매우 일반적인 관행이며 특히 2.0 이전의 Ruby 버전과의 호환성을 제공하는 라이브러리에서 특히 그렇습니다.

def say(options = {})
  message = options.fetch(:message, "Hello World")
  puts 
end

say
# => "Hello World"

say message: "Today is Monday"
# => "Today is Monday"

키워드 인수 사용

메서드 정의에서 이름을 지정하여 메서드에서 키워드 인수를 정의합니다.

def say(message: "Hello World")
  puts message
end

say
# => "Hello World"

say message: "Today is Monday"
# => "Today is Monday"

여러 키워드 인수를 정의 할 수 있습니다. 정의 순서는 부적합합니다.

def say(message: "Hello World", before: "<p>", after: "</p>")
  puts "#{before}#{message}#{after}"
end

say
# => "<p>Hello World</p>"

say message: "Today is Monday"
# => "<p>Today is Monday</p>"

say after: "</p><hr>", message: "Today is Monday"
# => "<p>Today is Monday</p><hr>"

키워드 인수는 위치 인수와 함께 사용할 수 있습니다.

def say(message, before: "<p>", after: "</p>")
  puts "#{before}#{message}#{after}"
end

say "Hello World", before: "<span>", after: "</span>"
# => "<span>Hello World</span>"

키워드 인수를 위치 인수와 함께 사용하는 것은 Ruby 2.1 이전의 매우 일반적인 접근 방법이었습니다. 필요한 키워드 인수 를 정의 할 수 없었기 때문입니다.

또한 Ruby <2.0에서는 선택적 인수에 사용할 메서드 정의의 끝에 Hash 를 추가하는 것이 매우 일반적이었습니다. 구문은 키워드 인수와 매우 유사합니다. Hash 를 통한 선택적 인수가 Ruby 2 키워드 인수와 호환 될 수 있습니다.

def say(message, options = {})
  before = option.fetch(:before, "<p>")
  after  = option.fetch(:after, "</p>")
  puts "#{before}#{message}#{after}"
end

# The method call is syntactically equivalent to the keyword argument one
say "Hello World", before: "<span>", after: "</span>"
# => "<span>Hello World</span>"

정의되지 않은 키워드 인수를 전달하려고하면 오류가 발생합니다.

def say(message: "Hello World")
  puts message
end

say foo: "Hello"
# => ArgumentError: unknown keyword: foo

필수 키워드 인수

2.1

Ruby 2.1에서는 키워드 인수를 개선하기 위해 필요한 키워드 인수 가 도입되었습니다.

필요에 따라 키워드 인수를 정의하려면 기본값없이 인수를 선언하십시오.

def say(message:)
  puts message
end

say
# => ArgumentError: missing keyword: message

say message: "Hello World"
# => "Hello World"

필수 및 필수 키워드 인수를 혼합 할 수도 있습니다.

def say(before: "<p>", message:, after: "</p>")
  puts "#{before}#{message}#{after}"
end

say
# => ArgumentError: missing keyword: message

say message: "Hello World"
# => "<p>Hello World</p>"

say message: "Hello World", before: "<span>", after: "</span>"
# => "<span>Hello World</span>"

splat 연산자로 임의의 키워드 인수 사용하기

double splat ( ** ) 연산자를 사용하여 임의의 수의 키워드 인수를 허용하는 메소드를 정의 할 수 있습니다.

def say(**args)
  puts args
end

say foo: "1", bar: "2"
# {:foo=>"1", :bar=>"2"}

인수는 Hash 로 캡처됩니다. 예를 들어 원하는 인수를 추출하기 위해 Hash 를 조작 할 수 있습니다.

def say(**args)
  puts args[:message] || "Message not found"
end

say foo: "1", bar: "2", message: "Hello World"
# Hello World

say foo: "1", bar: "2"
# Message not found

키워드 인수가있는 splat 연산자를 사용하면 키워드 인수 유효성 검사를 방지 할 수 있습니다.이 메서드는 알 수없는 키워드의 경우 ArgumentError 를 발생시키지 않습니다.

표준 splat 연산자에 관해서는 Hash 를 메소드의 키워드 인수로 다시 변환 할 수 있습니다.

def say(message: nil, before: "<p>", after: "</p>")
  puts "#{before}#{message}#{after}"
end

args = { message: "Hello World", after: "</p><hr>" }
say(**args)
# <p>Hello World</p><hr>

args = { message: "Hello World", foo: "1" }
say(**args)
# => ArgumentError: unknown keyword: foo

이것은 일반적으로 들어오는 인수를 조작하여 기본 메소드에 전달해야 할 때 사용됩니다.

def inner(foo:, bar:)
  puts foo, bar
end

def outer(something, foo: nil, bar: nil, baz: nil)
  puts something
  params = {}
  params[:foo] = foo || "Default foo"
  params[:bar] = bar || "Default bar"
  inner(**params)
end

outer "Hello:", foo: "Custom foo"
# Hello:
# Custom foo
# Default bar


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow