为什么splat在数组定义中使用?

时间:2009-09-13 03:32:46

标签: ruby splat

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在这里有不同的含义吗?

3 个答案:

答案 0 :(得分:5)

它为catch

创建一个单独的平面数组

我不确定是否有人完全理解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值。