如何转换+=&引用;ruby中的to运算符

如何转换+=&引用;ruby中的to运算符,ruby,Ruby,我可以将“+”、“-”或“/”转换为操作员使用2。发送(“-”,3) 但它不适用于“+=” 我试着先转换符号;但也不管用 如何解决此问题?2.send(“-”,3)有效,因为-是一种方法,2响应该方法: 2.respond_to?('-') #=> true 另一方面,=和+=不是方法: 2.respond_to?('=') #=> false 2.respond_to?('+=') #=> false 即使=是一种有效的方法,那么 相当于: 2.send("=", 4)

我可以将
“+”
“-”
“/”
转换为操作员使用
2。发送(“-”,3)

但它不适用于
“+=”

我试着先转换符号;但也不管用

如何解决此问题?

2.send(“-”,3)
有效,因为
-
是一种方法,
2
响应该方法:

2.respond_to?('-') #=> true
另一方面,
=
+=
不是方法:

2.respond_to?('=')  #=> false
2.respond_to?('+=') #=> false
即使
=
是一种有效的方法,那么

相当于:

2.send("=", 4)
a = 2
a = a + 2
或者简单地说:

2 = 4
换句话说:它会将
2
重新定义为
4
,这是Ruby不允许的

这是因为变量(如上面的
a
)不是对象
a.send
不会将消息发送到变量
a
,而是发送到
a
所指的对象(
2

这同样适用于类似的
+=

a = 2
a += 2
相当于:

2.send("=", 4)
a = 2
a = a + 2
您可以将其改写为:

a = 2
a = a.send("+", 2)
赋值不是方法调用的一部分


1您可以通过
define\u method
实际定义方法
=

class Foo
  define_method('=') { |other| puts "`=' called with #{other}" }
end
但这只是一种普通的方法。特别是,它不会也不能改变对象分配给的变量或对象的标识:

 f = Foo.new
 #=> #<Foo:0x007ff20c0eeda8>
 f.send('=', 123)
 # `=' called with 123
 #=> nil
 f
 #=> #<Foo:0x007ff20c0eeda8>
f=Foo.new
#=> #
f、 发送('=',123)
#`='用123调用
#=>零
F
#=> #

+=
-=
不是运算符。当ruby看到
x+=1
时,她将其转换为
x=x+1
,然后对其进行计算<代码>+=
(和其他)仅为方便编码者而提供。谢谢你@Caryswoveland我关闭了它,因为在链接答案的评论中有一个完美的答案。
+=
(和其他)被称为缩写赋值。没有称为
+=
的方法,所以你不能
发送它。