红宝石中的运算符*和(*)是什么意思?

前端之家收集整理的这篇文章主要介绍了红宝石中的运算符*和(*)是什么意思?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我刚刚介绍自己的 Ruby splat oprator.我玩了很多的方式.但下面的实验不知何故让我
考虑两次:)
  1. langs = ["java","csharp","ruby","haskell" ]
  2. # => ["java","haskell"]
  3.  
  4. l1,*,l2 = *langs
  5. # => ["java","haskell"]
  6. l1
  7. # => "java"
  8. l2
  9. # => "haskell"
  10.  
  11. l1,l2 = *langs
  12. SyntaxError: (irb):27: Syntax error,unexpected tSTAR
  13. l1,l2 = *langs
  14. ^
  15. from /usr/bin/irb:12:in `<main>'

是的,错误是显而易见的,因为我在同一个参数列表中使用了多个1 *(splat)运算符.

现在我试图玩它.

  1. l1,(*),"haskell"]

啊!这里工作.但是不明白为什么呢

  1. l1
  2. # => "java"
  3. l2
  4. # => "haskell"
  5. l1,"haskell"]
  6. l1
  7. # => "java"
  8. l2
  9. # => "ruby"

从上面的例子看,它正在跳过数组元素.

问题是:

(a)运算符(*)被调用
>(b)当我在第l1行中使用splat(*)时,l2 = * langs会消耗所有元素 – “csharp”,“ruby”.有没有办法看到什么*在技术上消耗?显然,如果l1,l2 = * langs不是由l1,l *,l2 = * langs,我正在使用.

解决方法

这是由于Matz所解释的 how parentheses work with parallel assignment.

例如:

  1. a,b,c = *[1,2,3]
  2. a => 1
  3. b => 2
  4. c => 3

不同于:

  1. a,(b,c) = *[1,3]
  2. a => 1
  3. b => 2
  4. c => nil

基本上,圆括号表示:将此索引处的右手元素分配给括号中的变量.所以2被分配给b,索引1上没有任何内容分配给c.类似地,(*)将仅使用给定索引处的元素并进行分发.

  1. # the * is interpreted to mean 'take all remaining elements'
  2. a,* = 1,3,4
  3.  
  4. # the * is interpreted to mean 'take all remaining elements except
  5. # the last element'
  6. a,c = 1,4
  7.  
  8. # incorrect Syntax,can't splat more than once on all remaining
  9. # elements
  10. a,4
  11.  
  12. # the * is interpreted to mean 'take all elements at index 1'
  13. a,4
  14.  
  15. # the *'s are interpreted to mean 'take all elements at index 1,# then again at index 2'
  16. a,4

通常,*运算符与* foo的变量结合使用 – 但是如果不是,它将保持其位置,并将元素分配视为变量(基本上是丢弃它们)

猜你在找的Ruby相关文章