为什么Ruby不支持i ++或i--(递增/递减运算符)?

And*_*hop 128 ruby language-design operators

前/后递增/递减运算符(++--)是非常标准的编程语言语法(至少对于过程语言和面向对象语言).

为什么Ruby不支持它们?我知道你可以用+=和完成同样的事情-=,但是排除这样的东西似乎有点奇怪,特别是因为它是如此简洁和传统.

例:

i = 0    #=> 0
i += 1   #=> 1
i        #=> 1
i++      #=> expect 2, but as far as I can tell, 
         #=> irb ignores the second + and waits for a second number to add to i
Run Code Online (Sandbox Code Playgroud)

我理解Fixnum是不可改变的,但如果+=能够实现一个新的Fixnum并设置它,为什么不做同样的事情++呢?

包含=角色的作业的一致性是唯一的原因,还是我错过了什么?

Bri*_*ian 93

以下是Matz(Yukihiro Matsumoto)在一个旧线程中解释它的方法:

Hi,

In message "[ruby-talk:02706] X++?"
    on 00/05/10, Aleksi Niemelä <aleksi.niemela@cinnober.com> writes:

|I got an idea from http://www.pragprog.com:8080/rubyfaq/rubyfaq-5.html#ss5.3
|and thought to try. I didn't manage to make "auto(in|de)crement" working so
|could somebody help here? Does this contain some errors or is the idea
|wrong?

  (1) ++ and -- are NOT reserved operator in Ruby.

  (2) C's increment/decrement operators are in fact hidden assignment.
      They affect variables, not objects.  You cannot accomplish
      assignment via method.  Ruby uses +=/-= operator instead.

  (3) self cannot be a target of assignment.  In addition, altering
      the value of integer 1 might cause severe confusion throughout
      the program.

                            matz.
Run Code Online (Sandbox Code Playgroud)

  • 2和3似乎是矛盾的.如果自我分配不好,为什么`+ =`/` - =`好吗?不会'1 + = 1'同样糟糕吗?(它在IRB中失败,出现"语法错误,意外分配") (10认同)
  • @Andy_Vulhop:#3正在解释为什么技术上不可能将赋值作为一种方法,而不是为什么一般不能进行赋值(Matz回答的海报认为可能创建一个`++`方法). (6认同)
  • 也许我在这里遗漏了一些东西.`+ =`用一个全新的对象替换变量引用的对象.您可以通过在`i + = 1`之前和之后调用`i.object_id`来检查这一点.为什么这对于`++`来说在技术上更难处理? (5认同)
  • (2)意味着在C中,你不是在改变值本身......你正在改变保存值的变量的内容.对于任何通过价值的语言而言,这有点太元了.除非有办法在Ruby中通过引用传递某些东西(我的意思是真正"通过引用",而不是通过值传递引用),否则在方法中不可能改变变量本身. (2认同)
  • 在Ruby中,所有文字都是对象.所以我相信Matz试图说他不确定他是否喜欢将1 ++作为陈述来处理.我个人认为这是不合理的,因为@Andy_Vulhop说1 + = 2就像wack一样,而Ruby只会在你这样做时引发错误.所以1 ++并不难处理.可能解析器需要处理这种语法糖是不可取的. (2认同)

sep*_*p2k 28

一个原因是到目前为止,每个赋值运算符(即更改变量的运算符)都包含=在其中.如果添加++--,那情况就不一样了.

另一个原因是人们的行为++--经常混淆.i++例证:你的例子中的返回值实际上是1,而不是2(i然而,新值将是2).

  • 到目前为止,除了任何其他原因之外,"所有作业中都有`=`"的理性似乎是有道理的.作为对一致性的激烈坚持,我可以尊重这一点. (4认同)

Chu*_*uck 23

它在OO语言中并不常见.事实上,++Smalltalk中没有这种语言,它创造了"面向对象编程"这一术语(而Ruby语言受其影响最大).你的意思是它在C中是常规的,并且语言非常接近C语言.Ruby确实有一种类似C语言的语法,但它并不是坚持C传统的奴隶.

至于为什么它不在Ruby中:Matz不想要它.这才是真正的终极原因.

Smalltalk中没有这样的东西的原因是因为它是语言最重要的哲学的一部分,分配变量从根本上讲是一种不同于向对象发送消息的东西 - 它在不同的层面上.这种想法可能影响了Matz设计Ruby.

将它包含在Ruby中并不是不可能的 - 您可以轻松编写一个将所有内容++转换为的预处理器+=1.但显然Matz并不喜欢操作员做过"隐藏任务"的想法.拥有一个隐藏整数操作数的运算符也似乎有点奇怪.该语言中没有其他运算符以这种方式工作.


Mla*_*vić 11

我认为还有另一个原因:++在Ruby中它不会像在C及其直接后继中那样有用.

原因是for关键字:虽然它在C中是必不可少的,但它在Ruby中基本上是多余的.Ruby中的大多数迭代都是通过Enumerable方法完成的,例如each,map当迭代一些数据结构时,以及Fixnum#times方法时,需要循环一次精确的次数.

实际上,据我所知,大部分时间+=1是由C语言语言新近迁移到Ruby的人使用的.

简而言之,它是否真的值得怀疑,如果方法++--将被使用.