Ruby 2.0 では、次のような名前付きパラメーターが追加されています。
def say(greeting: 'hi')
puts greeting
end
say # => puts 'hi'
say(greeting: 'howdy') # => puts 'howdy'
デフォルト値を指定せずに名前付きパラメーターを使用して、それらが必要になるようにするにはどうすればよいですか?
Ruby 2.0.0 では特定の方法はありませんが、Ruby 2.1.0のような構文で実行できます。def foo(a:, b:) ...
Ruby 2.0.x では、例外を発生させる任意の式を配置することで強制できます。たとえば、次のようになります。
def say(greeting: raise "greeting is required")
# ...
end
これを頻繁に行う予定がある (そして Ruby 2.1 以降を使用できない) 場合は、次のようなヘルパー メソッドを使用できます。
def required
method = caller_locations(1,1)[0].label
raise ArgumentError,
"A required keyword argument was not specified when calling '#{method}'"
end
def say(greeting: required)
# ...
end
say # => A required keyword argument was not specified when calling 'say'
現時点 (Ruby 2.0.0-preview1) では、次のメソッド シグネチャを使用できます。
def say(greeting: greeting_to_say)
puts greeting
end
はgreeting_to_say
、名前付きパラメーターに引数を指定した場合に評価されない単なるプレースホルダーです。これを渡さない場合 (単に を呼び出した場合say()
)、ruby はエラーを発生させます。
NameError: undefined local variable or method `greeting_to_say' for (your scope)
ただし、その変数は何にもバインドされておらず、私が知る限り、メソッド内から参照することはできません。名前付きパラメーターに渡されたものを参照するために、引き続きgreeting
ローカル変数として使用します。
実際にこれを行う場合はdef say(greeting: greeting)
、エラーメッセージがパラメーターに付けた名前を参照するように使用することをお勧めします。上記の例では、必要な名前付きパラメーターに引数を指定しなかった場合に表示されるエラー メッセージで ruby が使用するものを説明するために、異なるものだけを選択しました。
接線的に言えば、say('hi')
rubyを呼び出すArgumentError: wrong number of arguments (1 for 0)
と発生するので、少し混乱すると思いますが、プレビュー 1 のみです。
@awendt と @Adam のソリューションを組み合わせて、
def say(greeting: ->{ raise ArgumentError.new("greeting is required") }.call)
puts greeting
end
次のような方法でこれを乾燥させることができます。
def required(arg)
raise ArgumentError.new("required #{arg}")
end
def say(greeting: required('greeting'))
puts greeting
end
そして、それを @ Marc-Andre のソリューションと組み合わせる: https://gist.github.com/rdp/5390849
どうですか:
def say(greeting: nil)
greeting or raise ArgumentError
puts greeting
end
say # => raises ArgumentError
say(greeting: 'howdy') # => puts 'howdy'
それ以外は難しいでしょう。このサイトによると、キーワード引数は「デフォルト値を持つ名前付きパラメーターです。」</p>