代码之家  ›  专栏  ›  技术社区  ›  Andy_Vulhop

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

  •  125
  • Andy_Vulhop  · 技术社区  · 14 年前

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

    为什么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
    

    我理解 Fixnum 是不变的,但如果 += 固定数 设定它,为什么不做同样的事情呢 ++ ?

    作业的一致性是否包含 = 性格是唯一的原因,还是我遗漏了什么?

    9 回复  |  直到 5 年前
        1
  •  99
  •   atw    9 年前

    下面是Matz(松本幸纪弘)如何用一个古老的例子来解释它 thread :

    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.
    
        2
  •  28
  •   sepp2k    14 年前

    = 在里面。如果你加上 ++ --

    另一个原因是 经常让人迷惑。例如:的返回值 i++ i 将是2,但是)。

        3
  •  25
  •   Chuck    14 年前

    ++ 在Smalltalk中,创造了术语“面向对象编程”的语言(Ruby语言受其影响最大)。你的意思是这是传统的 C级 Ruby确实有点类似C的语法,但它并没有死守C的传统。

    至于为什么不是Ruby:Matz不想要。这才是最终的原因。

    ++ 进入之内 +=1 . 但很明显,Matz不喜欢使用“隐藏赋值”的运算符,而且在运算符内部有一个隐藏整数操作数似乎也有点奇怪。语言中没有其他操作符是这样工作的。

        4
  •  12
  •   the Tin Man    8 年前

    ++ 在Ruby中不会像在C及其直接继承者中那样有任何用处。

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

    +=1 被刚从C风格语言迁移到Ruby的人使用。

    简而言之,如果方法 ++ -- 完全不用了。

        5
  •  3
  •   rogerdpack    14 年前

    a = SomeClass.new
    def a.go
      'hello'
    end
    # at this point, you can call a.go
    # but if you did an a++
    # that really means a = a + 1
    # so you can no longer call a.go
    # as you have lost your original
    

        6
  •  3
  •   the Tin Man    8 年前

    .+ 自增运算符:

    class Variable
      def initialize value = nil
        @value = value
      end
      attr_accessor :value
      def method_missing *args, &blk
        @value.send(*args, &blk)
      end
      def to_s
        @value.to_s
      end
    
      # pre-increment ".+" when x not present
      def +(x = nil)
        x ? @value + x : @value += 1
      end
      def -(x = nil)
        x ? @value - x : @value -= 1
      end
    end
    
    i = Variable.new 5
    puts i                #=> 5
    
    # normal use of +
    puts i + 4            #=> 9
    puts i                #=> 5
    
    # incrementing
    puts i.+              #=> 6
    puts i                #=> 6
    

    有关“类变量”的详细信息,请参阅 Class Variable to increment Fixnum objects

        7
  •  2
  •   Andy_Vulhop    8 年前

    用大卫·布莱克在他的书《有良好基础的红宝石家》中的话来说:

    整数、符号(看起来像:this)和特殊对象true、false和 值本身,而不是对它的引用。 在实践中,这并不重要(而且它通常是隐含的,而不是隐含的) 在本书参考文献和相关主题的讨论中反复阐述)。 Ruby自动处理对象引用的取消引用;您不必这样做 做任何额外的工作来向包含引用的对象发送消息 与包含立即整数值的对象相反的字符串。 但是立即值表示规则有几个有趣的分支, 尤其是整数。首先,任何物体 分配给它的变量。只有一个object 100,只有一个object false,还有 等等。 整数绑定变量的直接、唯一性是Rubys缺少 前置和后置递增运算符也就是说,在Ruby中不能这样做: x=1 x++#没有这样的运算符 也就是说你要把数字1改成数字2 没道理。

        8
  •  1
  •   the Tin Man    8 年前

    这不能通过向fixnum或Integer类添加新方法来实现吗?

    $ ruby -e 'numb=1;puts numb.next'
    

    返回2

    ! 以警告可能的用户,因此添加一个名为 next!

    $ ruby -e 'numb=1; numb.next!; puts numb' 
    

    返回2(因为numb已递增)

    当然,这个 下一个! 方法必须检查对象是整数变量而不是实数,但是 随时待命。

        9
  •  1
  •   Akshay batra    3 年前

    Ruby中的一些对象作为立即值存储在变量中。其中包括 整数、符号(看起来像:this)和特殊对象true、false和nil . 将这些值中的一个赋给变量(x=1)时,变量将保存该值本身,而不是对该值的引用。

    任何表示为立即值的对象总是完全相同的对象,不管它被赋给多少个变量。只有一个对象100,只有一个对象false,以此类推。

    x=1

    原因是由于x中立即存在1,x++就像1++,这意味着将数字1改为数字2,这是没有意义的。

        10
  •  -6
  •   the Tin Man    8 年前

    x = 2    # x is 2
    x += 2   # x is 4
    x++      # x is now 8
    ++x      # x reverse to 4
    
    推荐文章