サーチ…


備考

キーワード引数は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ルビー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>"

スプラット演算子で任意のキーワード引数を使用する

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が発生しません。

標準のスプラット演算子については、 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