应用于范围表达式时如何理解 splat 运算符?

How is the splat operator understood when applied to a range expression?

我发现表达式 [*1..4] returns 和我做 (1..4).to_a 一样,但我不明白这里的语法。我的理解是 * 是 - 在这种情况下是一元运算符 - 是 splat 运算符 ,并且在它的右边,我们有一个范围。但是,如果只写表达式*1..4,这是语法错误,*(1..4)也是语法错误。为什么第一个 [*1..4] 起作用以及如何详细理解它?

splat * 将对象转换为 值列表(通常是 参数列表) =14=] 方法,所以 *1..4 等同于:

1, 2, 3, 4

以上内容本身无效。但是用方括号括起来,[*1..4] 变成:

[1, 2, 3, 4]

哪个有效。

你也可以写成 a = *1..4 相当于:

a = 1, 2, 3, 4
#=> [1, 2, 3, 4]

此处,由于 Ruby 的 implicit array assignment,值列表变为数组。