为什么 x-- 是一个有效的 ruby 语句,但它什么也没做?

Why is x-- a valid ruby statement but it doesn't do anything?

我知道 ruby 不像 C 那样支持整数递增 x++ 或递减 x--。但是当我使用它时,它什么也不做,也不会抛出错误。为什么?

编辑:

抱歉,我实际找到的代码使用的是 --x,这略有不同,但问题仍然存在:为什么?

x = 10
while --x > 0
  y = x
end

But when I use it, it doesn't do anything and doesn't throw an error either.

确实如此:

ruby -ce 'x--'
# -e:1: syntax error, unexpected end-of-input

x-- 是无效的 Ruby 语法。

在Ruby、operators are methods。 --x、x++、x== 等都可以做截然不同的事情。 --++ 本身不是有效的运算符。它们是运算符的组合。

对于您提供的代码,--x-(-x) 相同。

如果 x = 5,则 -x == -5--x == 5

---x 将是 -(-(-x)),依此类推。

同样,x-- 单独在一行中在技术上是有效的,具体取决于下一行代码包含的内容。

例如以下方法有效:

  def foo
    x = 1
    y = 10
    x--
    y
  end

该方法的最后两行被解释为 x - (-y),计算结果为 1 - (-10)

结果没有分配给任何值,因此 x-- 行似乎什么都不做,函数只会 return 结果:11.

你甚至可以在函数的最后一行使用 nil 而不是 y,你不会得到语法错误,但是当函数是叫。您将从 x--nil 收到的错误是:

NoMethodError: undefined method `-@' for nil:NilClass

这意味着 -nil 无效,因为 nil 没有定义方法 -@@ 表示 - 相当于 unary operator。另一种通过手动调用一元运算符来表达 --x 的方法是 x.-@.-@

x-- 单独使用是无效的。它需要一个数字对象跟随它(或任何实现 -@ 的对象)。该对象可以在下一行。 x== 会以同样的方式工作。