Ruby赋值运算符

0ve6wy6x  于 2023-05-22  发布在  Ruby
关注(0)|答案(3)|浏览(143)

为什么加法运算符是一个方法,而赋值运算符+=不是?
为什么运营商要这样做:

ruby-head > 2.+(4)  
# => 6

赋值运算符是这样工作的:

ruby-head > i = 1  
# => 1  
ruby-head > i += 1  
# => 2  
ruby-head > i.+=(1) 
# SyntaxError: (irb):26: syntax error,
# unexpected '=' i.+=(1)
#                   ^  from /Users/fogonthedowns/.rvm/rubies/ruby-head/bin/irb:17:in
# > `<main>'
vlf7wbxs

vlf7wbxs1#

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

dwbf0jvd

dwbf0jvd2#

+=(正如我推测的那样)是使用+方法的语法糖。如果你子类化或者对一个类进行monkey-patch来改变+的行为:

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
mkh04yzy

mkh04yzy3#

因为+=只是完整表达式的简写。
如果它是一个自己的消息,那么为类添加运算符行为将需要为每个速记组合定义一个赋值运算符,除了已经可能需要的普通赋值运算符和每个二元运算符之外。
很难想象所有这些额外的工作会有什么收获,所以Ruby将组合赋值操作符简单地视为完整表达式的简写。

相关问题