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

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

Rack::Cascadesplat(*)的这个方法中,[*catch]代码中的作用是什么?

我认为在方法参数中使用了 splat 来指示您何时将拥有未指定数量的参数。

splat在这里有不同的含义吗?

4

3 回答 3

5

它为 catch 创建一个平面数组

我不确定是否有人完全理解 splat 运算符。很多时候它会删除一层“数组”,但不会删除最后一层。

至少在这种情况下有可能得到它。无论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响应。响应编号被用作 akey并且 true 被设置为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

另一种看待它的方式:l 值 splat 是贪婪的,并且包含尽可能多的对应 r 值。

于 2009-09-13T04:03:56.623 回答