gpt4 book ai didi

ruby - [*a..b] 在 Ruby 中的语法是什么意思?

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

注意: mischa 的 splat on GitHub有很多很酷的 * 互动示例。

通过谷歌搜索,我发现了一种在 Ruby 中迭代一系列数字的方法(经典的 C 风格 for 循环)

for (i = first; i <= last; i++) {
whatever(i);
}

就是做这样的事情

[*first..last].each do |i|
whatever i
end

但是 [*first..last] 语法到底发生了什么?我玩过 irb,我看到了这个:

ruby-1.9.2-p180 :001 > 0..5
=> 0..5
ruby-1.9.2-p180 :002 > [0..5]
=> [0..5]
ruby-1.9.2-p180 :003 > [*0..5]
=> [0, 1, 2, 3, 4, 5]
ruby-1.9.2-p180 :004 > *0..5
SyntaxError: (irb):4: syntax error, unexpected tDOT2, expecting tCOLON2 or '[' or '.'
*0..5
^

我在网上阅读的所有内容都讨论了一元星号对于扩展和折叠传递给方法的参数很有用,对于可变长度参数列表很有用

def foo(*bar)
bar
end

foo 'tater' # => ["tater"]
foo 'tater', 'tot' # => ["tater", "tot"]

我明白了,但我看不出它如何应用于我上面的 block 示例中完成的扩展。

明确地说,我知道 Ruby 之道是遍历数组或集合,而不是使用数组长度并使用整数索引进行迭代。然而,在这个例子中,我真正处理的是一个整数列表。 :)

最佳答案

[*1..10]

是一样的
(1..10).to_a # call the "to array" method

您创建的 Array 类的实例实现了 Enumerable,因此您的循环可以正常工作。在定义 to_a 方法的类上,您可以使用带括号的 splat 运算符 语法。不过,Splat 不仅可以调用 #to_a,还可以做更多的事情,值得自己在 Google 上搜索一下。

现在,在您的情况下,Range 类本身已经是一个Enumerable,因此您可以这样做:

(first..last).each do |v| 
...
end

关于ruby - [*a..b] 在 Ruby 中的语法是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5981783/

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