47

Ruby 2.0 では、次のような名前付きパラメーターが追加されています。

def say(greeting: 'hi')
  puts greeting
end

say                     # => puts 'hi'
say(greeting: 'howdy')  # => puts 'howdy'

デフォルト値を指定せずに名前付きパラメーターを使用して、それらが必要になるようにするにはどうすればよいですか?

4

5 に答える 5

92

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'
于 2013-02-25T23:55:18.280 に答える
19

現時点 (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 のみです。

于 2012-11-06T11:58:43.007 に答える
12

@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

于 2012-11-28T19:31:25.937 に答える
3

どうですか:

def say(greeting: nil)
  greeting or raise ArgumentError
  puts greeting
end

say                     # => raises ArgumentError
say(greeting: 'howdy')  # => puts 'howdy'

それ以外は難しいでしょう。このサイトによると、キーワード引数は「デフォルト値を持つ名前付きパラメーターです。」</p>

于 2012-11-06T11:57:20.523 に答える