Ruby では、メソッド プロトタイプの引数は、デフォルト値が割り当てられておらず、ブロックでない場合にのみ必要です。ブロックは常にオプションです (ただし、メソッドの実装に関してはオプションではない場合があります)。次の点を考慮してください。
def foo(bar, baz = nil, bin = :bang, &block)
この例でbar
は、割り当てられていない場合はデフォルト値を受け取らないため、必須です。これ以上パラメータを指定したくない場合は、指定する必要はありません - baz
will be assigned nil
, and bin
will be assigned :bang
.
foo
justとの値を渡すこともできます。baz
無視bin
して、デフォルトの : を受け取るようにしますfoo(:some_bar, :some_baz)
。
の値を渡したいのに の値を渡したくbin
ない場合はbaz
、行き詰まります。Ruby では、引数 1 と 3 に値を渡して 2 をスキップすることはできません。引数 3 に到達するには、引数 2 を渡す必要があるため、呼び出しの場合がございますfoo(:some_bar, nil, :boom)
。
前述のように、ブロックは常にオプションです。意味的には、ブロックが必要になる場合があります。たとえば、
def foo(&block)
yield
end
ブロックなしで foo を呼び出すと、 が返されますLocalJumpError: no block given (yield)
。メソッドの実行にブロックが必要な場合、ブロックを渡さなかったことがユーザーに通知されるため、これはおそらく適切です。ただし、ブロックがオプションの可能性がある場合は、ブロックが渡されたかどうかをテストblock_given?
できるため、引数が渡されたかどうかに基づいてメソッドの実装を調整できます。