【问题标题】:Ruby Assignment OperatorsRuby 赋值运算符
【发布时间】:2011-01-01 01:29:42
【问题描述】:

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

为什么运算符会这样工作:

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

虽然赋值运算符以这种方式工作:

红宝石头> i = 1
=> 1
红宝石头>我 += 1
=> 2
红宝石头 > i.+=(1) SyntaxError: (irb):26: 语法错误, 意外'=' i.+=(1) ^ 来自 /Users/fogonthedowns/.rvm/rubies/ruby-head/bin/irb:17:in `'

【问题讨论】:

  • 有趣。 += 将如何对“+”运算符的重新实现做出反应?也许 '+=' 只是将变量分配给 variable.+(some value) 的结果的语法糖。
  • 你的问题是,“为什么这个东西是这样设计的?”除了“因为语言设计者决定是这样的”之外,您是否期望得到任何答案?您是否希望 Matz 本人来解释他的设计原理?
  • @Phrogz:其实还有比这更好的答案,sepp2k 给出了。
  • 也许我对问题形式过于直白了。也许人们普遍理解“为什么this是这样的?”的问题。实际上是“如果我们将 this 更改为其他内容,请解释后果。”

标签: ruby


【解决方案1】:

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

【讨论】:

  • 或者更根本地说:因为变量不是对象。如果它们,则可以将= 实现为变量上的一种方法。
  • Ruby 一直以来都是对象 :(
【解决方案2】:

+= 是(正如我猜想的)使用 + 方法的语法糖。如果你对一个类进行子类化或猴子补丁以改变 + 的行为:

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 

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 我认为这不是问题。所有赋值运算符都可以在Object 上定义(例如def +=(o) self = self + o end 之类的东西,当与不响应+ 的对象一起使用时仍会导致NoMethodError 并为执行的对象提供所需的行为- 除了它当然不起作用)。问题在于您不能将赋值运算符定义为方法,因为您不能定义适用于变量的方法。
    猜你喜欢
    • 2012-01-24
    • 2012-02-26
    • 1970-01-01
    • 2011-08-02
    • 2019-10-06
    • 2011-11-16
    • 2013-11-30
    • 2015-10-02
    • 1970-01-01
    相关资源
    最近更新 更多