Ruby赋值运算符

Ruby赋值运算符,ruby,Ruby,为什么加法“运算符”是一种方法,而赋值运算符+=不是 为什么操作员会这样工作: 红宝石头>2.+(4) =>6 当赋值运算符以这种方式工作时: 红宝石头>i=1 =>1 红宝石头>i +=1 =>2 红宝石头>i.+=(1) 语法错误:(irb):26:语法错误, 意外的“=”i.+=(1) ^from/Users/fogonthedowns/.rvm/rubies/ruby head/bin/irb:17:in `" 因为赋值作用于变量而不是对象,因此不能作为方法实现。因为+=只是完整表达式的

为什么加法“运算符”是一种方法,而赋值运算符+=不是

为什么操作员会这样工作:

红宝石头>2.+(4)
=>6

当赋值运算符以这种方式工作时:

红宝石头>i=1
=>1
红宝石头>i +=1
=>2
红宝石头>i.+=(1) 语法错误:(irb):26:语法错误, 意外的“=”i.+=(1) ^from/Users/fogonthedowns/.rvm/rubies/ruby head/bin/irb:17:in `"


因为赋值作用于变量而不是对象,因此不能作为方法实现。

因为
+=
只是完整表达式的简写

如果它是自己的消息,那么为类添加运算符行为将需要为每个速记组合定义一个赋值运算符,此外还需要为普通赋值和每个二进制运算符定义可能已经需要的运算符

很难想象所有这些额外的工作会得到什么,因此Ruby将组合赋值运算符简单地视为完整表达式的简写。

正如我猜想的那样,+=是使用+方法的语法糖。如果您对类进行子类化或猴子补丁以更改+:

class CustomPlus
  attr_accessor :value
  def initialize(value)
    @value = value
  end
  def +(other)
    value + other * 2
  end
end
结果是:

ruby-1.9.1-p378 > a = CustomPlus.new(2)
 => #<CustomPlus:0x000001009eaab0 @value=2> 
ruby-1.9.1-p378 > a.value
 => 2 
ruby-1.9.1-p378 > a+=2
 => 6 
ruby-1.9.1-p378>a=CustomPlus.new(2)
=> # 
ruby-1.9.1-p378>a.value
=> 2 
ruby-1.9.1-p378>a+=2
=> 6 

很有趣。+=对重新实现'+'运算符有何反应?也许“+=”仅仅是将变量分配给变量结果的语法糖。+(某些值)。这几乎与您的问题“为什么这个东西设计成这样?”重复。您是否希望得到除“因为语言设计师决定它是这样”之外的任何答案你希望Matz自己来解释他的设计理念吗?@Phrogz:事实上,还有一个比这个更好的答案,sepp2k给出了。也许我对问题形式太过直截了当了。也许人们普遍认为,“为什么是这样?”的问题实际上是“请解释一下,如果我们把它改成其他东西的后果。”我不认为这是一个问题。所有赋值运算符只能在
对象上定义(例如
def+=(o)self=self+o end
,当与不响应
+
的对象一起使用时,仍然会导致
NoMethodError
,并为响应的对象提供所需的行为,当然不起作用). 问题在于不能将赋值运算符定义为方法,因为不能定义处理变量的方法。或者更根本的是,因为变量不是对象。如果是的话,我们可以将
=
作为变量的一种方法来实现(