我刚刚介绍自己的
Ruby splat oprator.我玩了很多的方式.但下面的实验不知何故让我
考虑两次:)
考虑两次:)
是的,错误是显而易见的,因为我在同一个参数列表中使用了多个1 *(splat)运算符.
现在我试图玩它.
- l1,(*),"haskell"]
啊!这里工作.但是不明白为什么呢
- l1
- # => "java"
- l2
- # => "haskell"
- l1,"haskell"]
- l1
- # => "java"
- l2
- # => "ruby"
从上面的例子看,它正在跳过数组元素.
问题是:
(a)运算符(*)被调用?
>(b)当我在第l1行中使用splat(*)时,l2 = * langs会消耗所有元素 – “csharp”,“ruby”.有没有办法看到什么*在技术上消耗?显然,如果l1,l2 = * langs不是由l1,l *,l2 = * langs,我正在使用.
解决方法
这是由于Matz所解释的
how parentheses work with parallel assignment.
例如:
- a,b,c = *[1,2,3]
- a => 1
- b => 2
- c => 3
不同于:
- a,(b,c) = *[1,3]
- a => 1
- b => 2
- c => nil
基本上,圆括号表示:将此索引处的右手元素分配给括号中的变量.所以2被分配给b,索引1上没有任何内容分配给c.类似地,(*)将仅使用给定索引处的元素并进行分发.
- # the * is interpreted to mean 'take all remaining elements'
- a,* = 1,3,4
- # the * is interpreted to mean 'take all remaining elements except
- # the last element'
- a,c = 1,4
- # incorrect Syntax,can't splat more than once on all remaining
- # elements
- a,4
- # the * is interpreted to mean 'take all elements at index 1'
- a,4
- # the *'s are interpreted to mean 'take all elements at index 1,# then again at index 2'
- a,4
通常,*运算符与* foo的变量结合使用 – 但是如果不是,它将保持其位置,并将元素分配视为变量(基本上是丢弃它们)