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

它为catch创建了一个单独的平面数组

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

至少可以在这种情况下得到它。 无论catch是单个数字还是数字数组,它都会为catch参数创建单个数组级别。

 >> t = [*404] => [404] >> t = [*[404,405,406]] => [404, 405, 406] 

我认为理解这一点的最好方法是查看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/

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