gpt4 book ai didi

ruby - ruby 中的运算符 * 和 (*) 是什么意思?

转载 作者:数据小太阳 更新时间:2023-10-29 06:39:06 25 4
gpt4 key购买 nike

我刚刚向 Ruby splat oprator 介绍了自己。我玩了很多方法。但下面的实验不知何故让我三思而后行:)

langs = ["java", "csharp", "ruby", "haskell" ]
# => ["java", "csharp", "ruby", "haskell"]

l1,*,l2 = *langs
# => ["java", "csharp", "ruby", "haskell"]
l1
# => "java"
l2
# => "haskell"

l1,*,*,l2 = *langs
SyntaxError: (irb):27: syntax error, unexpected tSTAR
l1,*,*,l2 = *langs
^
from /usr/bin/irb:12:in `<main>'

是的,错误很明显,因为我在同一参数列表中使用了超过 1 个 *(splat) 运算符。

现在我试着玩玩它。

l1,(*),(*),l2 = *langs
# => ["java", "csharp", "ruby", "haskell"]

啊!在这里它有效。但不明白为什么会这样?

 l1
# => "java"
l2
# => "haskell"
l1,(*),l2 = *langs
# => ["java", "csharp", "ruby", "haskell"]
l1
# => "java"
l2
# => "ruby"

从上面的例子来看,它似乎是在跳过数组元素。

问题是:

  • (a) 运算符 (*) 叫什么?

  • (b) 当我在行 l1,*,l2 = *langs 中使用 splat(*) 时,它消耗了所有元素 - "csharp", "ruby “。有什么方法可以从技术上查看 * 消耗了什么?显然我是在告诉 use if l1,*,l2 = *langs 而不是 l1,l*,l2 = *langs

最佳答案

这是由于 how parentheses work with parallel assignment正如 Matz 所解释的那样。

例如:

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

不同于:

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

基本上,括号表示:将在该索引处 的右手元素分配给括号中的变量。所以 2 被分配给 b,索引 1 没有任何东西分配给 c。同样,(*) 将只获取给定索引处的元素并分发它。

# the * is interpreted to mean 'take all remaining elements'
a, * = 1, 2, 3, 4

# the * is interpreted to mean 'take all remaining elements except
# the last element'
a, *, c = 1, 2, 3, 4

# incorrect syntax, can't splat more than once on all remaining
# elements
a, *, *, c = 1, 2, 3, 4

# the * is interpreted to mean 'take all elements at index 1'
a, (*), c = 1, 2, 3, 4

# the *'s are interpreted to mean 'take all elements at index 1,
# then again at index 2'
a, (*), (*), c = 1, 2, 3, 4

通常,* 运算符与变量一起使用,如 *foo - 但如果不是,它将保持原位并进行元素赋值,就好像它是一个变量(基本上丢弃它们)

关于ruby - ruby 中的运算符 * 和 (*) 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14944474/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com