Ruby Language
キーワード引数
サーチ…
備考
キーワード引数は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"
以前の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
必須のキーワード引数
必要なキーワード引数は、キーワード引数の改善として、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