如何转换+=&引用;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我关闭了它,因为在链接答案的评论中有一个完美的答案。+=
(和其他)被称为缩写赋值。没有称为+=
的方法,所以你不能发送它。