为什么加法运算符是一个方法,而赋值运算符+=
不是?
为什么运营商要这样做:
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>'
3条答案
按热度按时间vlf7wbxs1#
因为赋值作用于变量而不是对象,因此不能作为方法实现。
dwbf0jvd2#
+=(正如我推测的那样)是使用+方法的语法糖。如果你子类化或者对一个类进行monkey-patch来改变+的行为:
那么结果是这样的:
mkh04yzy3#
因为
+=
只是完整表达式的简写。如果它是一个自己的消息,那么为类添加运算符行为将需要为每个速记组合定义一个赋值运算符,除了已经可能需要的普通赋值运算符和每个二元运算符之外。
很难想象所有这些额外的工作会有什么收获,所以Ruby将组合赋值操作符简单地视为完整表达式的简写。