【问题标题】:How is the splat operator understood when applied to a range expression?splat 运算符在应用于范围表达式时如何理解?
【发布时间】:2020-07-28 02:53:18
【问题描述】:

我发现表达式[*1..4] 返回的结果与我执行(1..4).to_a 的结果相同,但我不明白这里的语法。我的理解是* - 在这种情况下是一元运算符 - 是 splat 运算符,在它的右边,我们有一个 Range。但是,如果只写表达式*1..4,这是一个语法错误,*(1..4) 也是一个语法错误。为什么第一个[*1..4]会起作用,具体是怎么理解的?

【问题讨论】:

  • 顺便说一句,这也很好用:r = (1..4); [*r]
  • 是的。括号是可选的;你可以写r=1..4; [*r],当然和我的[*1..4]一样。但是数组上下文是至关重要的。只是 *r 是行不通的。

标签: ruby splat


【解决方案1】:

splat * 通过调用其to_a 方法将对象转换为值列表(通常是参数列表),因此*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,值列表变成了一个数组。

【讨论】:

  • 你能用*符号做并行赋值吗?
  • @SagarPandya 当然,a, b = *1..2 等同于 a, b = 1, 2
猜你喜欢
  • 1970-01-01
  • 2015-06-22
  • 1970-01-01
  • 1970-01-01
  • 2012-04-20
  • 2020-12-12
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
相关资源
最近更新 更多