Ruby 中没有增量运算符 (++)? [复制]

Posted

技术标签:

【中文标题】Ruby 中没有增量运算符 (++)? [复制]【英文标题】:No increment operator (++) in Ruby? [duplicate] 【发布时间】:2011-04-12 15:55:55 【问题描述】:

可能重复:Why doesn't Ruby support i++ or i— for fixnum?

为什么 Ruby 中没有自增运算符?

例如

i++
++i

++ 运算符是否用于其他用途?这有真正的原因吗?

【问题讨论】:

什么是“真实”?你能以一种争论和主观的方式来定义“真正的原因”吗? 检查你的术语......“自动增量”是完全不同的东西。你有一个简单的增量运算符。 我同意@Kondrad,这只是 increment 而不是 auto increment (如果您需要区分两者,则为 preincrement 和 postincrement。)它也是一个 operator 而不是 operand。我将对问题进行编辑以整理此问题。我希望没问题。 这个副本的赞成票比原来的多。 【参考方案1】:

Ruby 没有前置/后置递增/递减运算符。例如,x++x-- 将无法解析。更重要的是,++x--x 不会做任何事情!事实上,它们表现为多个一元前缀运算符:-x == ---x == -----x == ...... 要增加一个数字,只需编写 x += 1

摘自《Ruby 新手应该知道的事》 " (archive, mirror)

这比我能解释得更好。

编辑:以及语言作者本人(source)的原因:

    ++ 和 -- 不是 Ruby 中的保留运算符。 C 的递增/递减运算符实际上是隐藏赋值。它们影响变量,而不是对象。您无法通过方法完成分配。 Ruby 改用 +=/-= 运算符。 self 不能成为分配的目标。此外,更改整数 1 的值可能会导致整个程序严重混乱。

【讨论】:

关于这个问题是有效的,但我希望“Ruby新手应该知道的事情”。已更新以反映 Ruby 1.9。 关于第 3 点,因为大多数东西都是对象,想象一下如果 Ruby 允许你这样做:1++ 1+2 # Would not be 3! 我觉得 1++ 意味着我们根本不应该有 ++ 运算符,这表明 1+=1 同样不好,因此我们也不应该有 +=,但我们做。因此,Matz 没有将其包括在内一定有更深层次的原因。也许实现这个所需的语法糖弄乱了解析器的另一部分?不知道,但它不可能只是自分配给文字是无效的 b/c Ruby 中的许多其他东西阻止分配文字就好了。 @steveMidgley 我应该包含作者第二条引述的来源 - blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/2710。 @Dave 谢谢。似乎核心问题在 #2 - 赋值影响变量而不是 Ruby 中的对象?由于变量不是对象(我认为变量只是不是对象的东西),你不能使用对象方法来解决这个问题。看起来这将是一个很好的例子,说明为什么 Ruby 非常接近“对象一直向下”但并不完全。【参考方案2】:

来自posting by Matz:

(1) ++ 和 -- 不是保留的 Ruby 中的运算符。

(2) C 的递增/递减 运算符实际上是隐藏的 任务。 它们影响变量,而不是对象。你无法完成 通过方法赋值。 Ruby 使用 +=/-= 运算符。

(3) 自己不能成为目标 任务。此外,改变 整数 1 的值可能会导致整个过程中的严重混淆 程序。

                      matz.

【讨论】:

@Donal 如果你的意思是,他们是否可以在不破坏事物的情况下追溯添加到语言中,那么我认为他们不能。 x = a++b 解析为 x = a + (+b) 所以如果我们只有 x++ 那么 Ruby 需要另一个操作数。这就是为什么如果你现在尝试使用++ 会出现语法错误,因为 Ruby 将下一条语句的一部分作为操作数。 += 实现为在接收器上调用+,将RHS 作为参数传递,然后将+ 返回的值赋给变量。 @Donal Fellows:变量不是 Ruby 中的对象。 我知道它们不能在不破坏向后兼容性的情况下在语法上完成,而且我认为 Matz 不这样做是正确的,但是由于隐藏分配而无法完成增量的论点是 一般错误。如果变量是对象,那么增量自然是变量类的方法。不知道这样的概念是否适合 Ruby 的世界模型。 :-) @Donal Fellows:但是变量不是 Ruby 中的对象,这就是为什么后增量不能作为变量对象上的方法来实现的原因。 @danielricecodes:不。Ruby 中有很多东西不是对象。变量就是其中之一。变量引用对象,但它们不是对象。【参考方案3】:

我不认为这种表示法是可用的,因为——与 php 或 C 不同——Ruby 中的一切都是对象。

当然你可以在 PHP 中使用$var=0; $var++,但那是因为它是一个变量而不是一个对象。因此,$var = new stdClass(); $var++ 可能会抛出错误。

我不是 Ruby 或 RoR 程序员,所以我相信有人可以验证上述内容,如果不准确,可以进行纠正。

【讨论】:

在 C 中,表达式 var++ 递增存储在由 var 表示的对象中的值(是的,原始值在 C 中存储为对象)。您的回答没有解释为什么在 Ruby 中也不能出现这种情况(因为当然,它可能 - 但语言设计者决定不这样做。真正的问题是 为什么?这并不像Ruby的对象系统有什么独特之处那么简单)。

以上是关于Ruby 中没有增量运算符 (++)? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

运算符 ||= 在 Ruby 中代表啥? [复制]

Java枚举是不是有增量运算符++? [复制]

ruby 中“&:”运算符的功能是啥? [复制]

在 Ruby 中,“=>”是啥意思,它是如何工作的? [复制]

Ruby问号运算符,这是啥意思? [复制]

++ 运算符在 Python 中做啥? [复制]