0

たとえば、Rails API では次のように表示されます。

form_tag(url_for_options = {}, options = {}, &block) 

C++/Java のバックグラウンドから来て、これは 3 つの引数すべてが必要であることを示唆しています: 2 つのハッシュと 1 つのブロックです。しかし、このメソッドが 3 つ未満の引数で、最初の引数が文字列の形式で使用されている例は数多くあります。メソッド テンプレートは、各引数の特性/型と、どの引数が必要かをどのように指定しますか? そのようなメソッドを呼び出す方法を説明するために使用される規則を説明する要約文書はどこかにありますか?

4

3 に答える 3

0

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?できるため、引数が渡されたかどうかに基づいてメソッドの実装を調整できます。

于 2013-07-11T18:21:11.213 に答える
0

通常の意味でのプロトタイプはありません。あなたの例では

form_tag(url_for_options = {}, options = {}, &block)

このform_tagメソッドは最大 2 つのパラメーターを想定していますが、両方のパラメーターにデフォルトが指定されているため、パラメーターをまったく指定せずに呼び出すことができます。Ruby は、指定されたよりも多くの引数でメソッドが呼び出されたArgumentError場合、またはデフォルトのないパラメーターよりも少ない引数でメソッドが呼び出された場合に を発生させます。

デフォルトのパラメーター値の型は、メソッドが呼び出されたときに渡される可能性があるものとは関係がなく、 のような呼び出しはform_tag(Math::PI, false)、有用なことはほとんどありませんが、正常にコンパイルされます。

仮パラメーターでブロックを指定すると、呼び出しで提供された任意のブロックに名前付きアクセスを与えるだけの効果があります。通常は、ブロックを実行しyield、メソッド内で使用してブロックとの間で値を渡す方が適切です。メソッドが呼び出されるとき、ブロックは常にオプションです。

于 2013-07-11T18:10:57.190 に答える
-1

任意の型を引数にすることができます。最初の 2 つの引数はデフォルトで空のハッシュになり、'&' 変数はブロックをキャプチャします。これは、デフォルトの引数をかなりよく説明しています。

于 2013-07-11T17:27:21.547 に答える