5
def initialize(apps, catch=404)
  @apps = []; @has_app = {}
  apps.each { |app| add app }

  @catch = {}
  [*catch].each { |status| @catch[status] = true }
end

Rack::Cascadeのこのメソッドsplat(*)では、コード内でどのような目的で使用され[*catch]ますか?

メソッドの引数で感嘆符を使用して、不特定の数のパラメーターをいつ使用するかを示していると思いました。

スプラットはここで別の意味を持っていますか?

4

3 に答える 3

5

キャッチ用の単一のフラット配列を作成します

スプラット演算子を完全に理解している人がいるかどうかはわかりません。多くの場合、1つのレベルの「配列」が削除されますが、最後のレベルは削除されません。

少なくともこの1つのケースでそれを取得することは可能です。単一の数値であるか数値の配列であるかに関係なく、catchパラメーターの単一レベルの配列を作成しcatchます。

>> t = [*404]
=> [404]
>> t = [*[404,405,406]]
=> [404, 405, 406]
于 2009-09-13T03:57:13.907 に答える
1

これを理解する最良の方法は、で何が起こっているかを調べることだと思いますirb

それでは、空のハッシュを初期化しましょう@catch

>> @catch = {}
=> {}
>> @catch.class
=> Hash

catch次に、パラメータがデフォルト値の404:になったらどうなるか見てみましょう。

>> catch=404
=> 404
>> [*catch].each { |status| @catch[status] = true }
=> [404]
>> @catch[404]
=> true

これにより、何が起こっているのかをよりよく理解できます。演算子が応答のsplat作成に使用されていることがわかります。Hash応答番号はaとして使用され、keytrueは。として設定されますvalue。したがって、キャッチするアイテムの数に関係なく、を作成できHashます。

>> catch=[404, 301, 302, 303, 403]
=> [404, 301, 302, 303, 403]
>> [*catch].each { |status| @catch[status] = true }
=> [404, 301, 302, 303, 403]
>> @catch
=> {302=>true, 303=>true, 403=>true, 404=>true, 301=>true}

これがお役に立てば幸いです。これが私を少し助けてくれたリンクです:

http://theplana.wordpress.com/2007/03/03/ruby-idioms-the-splat-operator/

于 2009-09-13T03:55:09.213 に答える
0

別の見方をすると、左辺値スプラットは貪欲で、対応する右辺値を可能な限り多く含みます。

于 2009-09-13T04:03:56.623 に答える