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 中没有增量运算符 (++)? [复制]的主要内容,如果未能解决你的问题,请参考以下文章