我知道ruby不像C那样支持整数递增x++或者递减x--,但是当我使用它的时候,它什么也不做,也不抛出错误,为什么呢?编辑:抱歉,我实际找到的代码使用的是--x,这略有不同,但问题仍然存在:为什么?
x++
x--
--x
x = 10 while --x > 0 y = x end
gjmwrych1#
但是当我使用它时,它什么也不做,也不抛出错误。它确实:
ruby -ce 'x--' # -e:1: syntax error, unexpected end-of-input
x--不是有效的Ruby语法。
ikfrs5lh2#
在Ruby中,operators are methods. --x,x ++,x ==等都可以做非常不同的事情。--和++本身不是有效的操作符,它们是操作符的组合。在您提供的代码中,--x与-(-x)相同。如果x == 5,则-x == -5和--x == 5。---x将是-(-(-x))等等。类似地,一行中单独的x--在技术上是有效的,这取决于下一行代码包含的内容。例如,以下方法有效:
--
++
-(-x)
x == 5
-x == -5
--x == 5
---x
-(-(-x))
def foo x = 1 y = 10 x-- y end
该方法的最后两行被解释为x - (-y),计算结果为1 - (-10)。结果不会被赋给任何值,因此x--行看起来什么也没做,函数只会返回结果:11.你甚至可以在函数的最后一行使用nil来代替y,这样你就不会得到语法错误,但是当函数被调用时你会得到一个运行时错误。
x - (-y)
1 - (-10)
nil
y
NoMethodError: undefined method `-@' for nil:NilClass
这意味着-nil是无效的,因为NilClass没有定义方法-@。@指示-作为unary operator工作。通过手动调用一元运算符来表示--x的另一种方法是x.-@.-@x--本身是无效的。它需要一个Numeric对象跟随其后(或任何实现-@的对象)。该对象可以在下一行。x==的工作方式相同。
-nil
NilClass
-@
@
-
x.-@.-@
x==
2条答案
按热度按时间gjmwrych1#
但是当我使用它时,它什么也不做,也不抛出错误。
它确实:
x--
不是有效的Ruby语法。ikfrs5lh2#
在Ruby中,operators are methods. --x,x ++,x ==等都可以做非常不同的事情。
--
和++
本身不是有效的操作符,它们是操作符的组合。在您提供的代码中,
--x
与-(-x)
相同。如果
x == 5
,则-x == -5
和--x == 5
。---x
将是-(-(-x))
等等。类似地,一行中单独的
x--
在技术上是有效的,这取决于下一行代码包含的内容。例如,以下方法有效:
该方法的最后两行被解释为
x - (-y)
,计算结果为1 - (-10)
。结果不会被赋给任何值,因此
x--
行看起来什么也没做,函数只会返回结果:11.你甚至可以在函数的最后一行使用
nil
来代替y
,这样你就不会得到语法错误,但是当函数被调用时你会得到一个运行时错误。这意味着
-nil
是无效的,因为NilClass
没有定义方法-@
。@
指示-
作为unary operator工作。通过手动调用一元运算符来表示--x
的另一种方法是x.-@.-@
x--
本身是无效的。它需要一个Numeric对象跟随其后(或任何实现-@
的对象)。该对象可以在下一行。x==
的工作方式相同。