Ruby では、メソッド プロトタイプの引数は、デフォルト値が割り当てられておらず、ブロックでない場合にのみ必要です。ブロックは常にオプションです (ただし、メソッドの実装に関してはオプションではない場合があります)。次の点を考慮してください。
def foo(bar, baz = nil, bin = :bang, &block)
この例でbarは、割り当てられていない場合はデフォルト値を受け取らないため、必須です。これ以上パラメータを指定したくない場合は、指定する必要はありません - bazwill be assigned nil, and binwill be assigned :bang.
foojustとの値を渡すこともできます。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?できるため、引数が渡されたかどうかに基づいてメソッドの実装を調整できます。