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]
代码中的用途是什么?
我认为在方法参数中使用了一个splat来指示何时会有一个未指定数量的参数。
splat在这里有不同的含义吗?
答案 0 :(得分:5)
我不确定是否有人完全理解splat运算符。很多时候它会删除一个级别的“数组”,但它不会删除最后一级。
至少可以在这种情况下获得它。无论catch
是单个数字还是数字数组,它都会为catch参数创建单个数组级别。
>> t = [*404]
=> [404]
>> t = [*[404,405,406]]
=> [404, 405, 406]
答案 1 :(得分:1)
我认为理解这一点的最佳方法是查看irb
中发生的事情。
所以让我们初始化一个空哈希@catch
:
>> @catch = {}
=> {}
>> @catch.class
=> Hash
现在让我们看看当参数catch
达到默认值404
时会发生什么:
>> catch=404
=> 404
>> [*catch].each { |status| @catch[status] = true }
=> [404]
>> @catch[404]
=> true
这使我们更好地了解发生了什么。我们可以看到splat
运算符用于构建Hash
个响应。响应号码用作key
,而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/
答案 2 :(得分:0)
另一种看待它的方法:l值splat是贪婪的并且包含尽可能多的相应r值。