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

fumotvh3  于 2023-03-08  发布在  Ruby
关注(0)|答案(2)|浏览(98)

我知道ruby不像C那样支持整数递增x++或者递减x--,但是当我使用它的时候,它什么也不做,也不抛出错误,为什么呢?
编辑:
抱歉,我实际找到的代码使用的是--x,这略有不同,但问题仍然存在:为什么?

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

gjmwrych1#

但是当我使用它时,它什么也不做,也不抛出错误。
它确实:

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

x--不是有效的Ruby语法。

ikfrs5lh

ikfrs5lh2#

在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--行看起来什么也没做,函数只会返回结果:11.
你甚至可以在函数的最后一行使用nil来代替y,这样你就不会得到语法错误,但是当函数被调用时你会得到一个运行时错误。

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

这意味着-nil是无效的,因为NilClass没有定义方法-@@指示-作为unary operator工作。通过手动调用一元运算符来表示--x的另一种方法是x.-@.-@
x--本身是无效的。它需要一个Numeric对象跟随其后(或任何实现-@的对象)。该对象可以在下一行。x==的工作方式相同。

相关问题