为什么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值。
- CheckoutController#在哪里编辑疯狂?
- Selenium:在Selenium RC ruby驱动程序中等待_for_ *和朋友
- Rails“ActiveRecord_Associations_CollectionProxy的未定义方法”
- 如何在运行时创建带变量名的sidekiq队列?
- 在Rails 3控制器中需要gem失败并且“常量缺失”
- Net :: SSH适用于生产rails控制台,AuthenticationFailed来自生产webapp
- 在cron中设置路径,以便它可以找到ruby
- Rails 5.1:销毁“has_many:through”与限制关联的记录
- 获取带符号的哈希作为轨道中mongo的键