我可以将"+"
,"-"
或"/"
转换为运算符使用2.send("-",3)
但它不适用于"+="
a = 2
a += 2 #=> 4
a = 2
a.send("+=", 4) #=> NoMethodError: undefined method `+=' for 2:Fixnum
我试图先转换符号;但也不行;
如何解决这个问题?
答案 0 :(得分:5)
2.send("-", 3)
有效,因为-
是一种方法,2
会对该方法做出响应:
2.respond_to?('-') #=> true
另一方面, =
和+=
不是方法:
2.respond_to?('=') #=> false
2.respond_to?('+=') #=> false
即使=
是一个有效的方法 1 ,那么
a = 2
a.send("=", 4)
相当于:
2.send("=", 4)
或简单地说:
2 = 4
换句话说:它会将2
重新定义为4
,这是Ruby不允许你这样做的。
这是因为变量(如上面的a
)不是对象。 a.send
不会向变量a
发送消息,但是对象a
指的是示例中的2
。
同样适用于abbreviated assignment,例如+=
:
a = 2
a += 2
相当于:
a = 2
a = a + 2
您可以将其重写为:
a = 2
a = a.send("+", 2)
赋值不是方法调用的一部分。
1 您实际上可以通过=
定义方法define_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>