为什么 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==
会以同样的方式工作。
我知道 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==
会以同样的方式工作。