如何在ruby中将"+ ="转换为运算符

jun*_*unk 2 ruby

我可以转换"+","-""/"运营商使用2.send("-",3)

但它不起作用 "+="

a = 2
a += 2 #=> 4

a = 2
a.send("+=", 4) #=> NoMethodError: undefined method `+=' for 2:Fixnum
Run Code Online (Sandbox Code Playgroud)

我试图先转换符号; 但也行不通;

怎么解决这个问题?

Ste*_*fan 5

2.send("-", 3)工作,因为-是一个方法,并2响应该方法:

2.respond_to?('-') #=> true
Run Code Online (Sandbox Code Playgroud)

=+=另一方面不是方法:

2.respond_to?('=')  #=> false
2.respond_to?('+=') #=> false
Run Code Online (Sandbox Code Playgroud)

即使=是有效的方法1,那么

a = 2
a.send("=", 4)
Run Code Online (Sandbox Code Playgroud)

相当于:

2.send("=", 4)
Run Code Online (Sandbox Code Playgroud)

或者干脆:

2 = 4
Run Code Online (Sandbox Code Playgroud)

换句话说:它将重新定义24Ruby不允许你做的事情.

这是因为变量(a如上所述)不是对象.a.send不向变量发送消息a,而是向对象发送消息a(2在示例中).

这同样适用于缩写分配,例如+=:

a = 2
a += 2
Run Code Online (Sandbox Code Playgroud)

相当于:

a = 2
a = a + 2
Run Code Online (Sandbox Code Playgroud)

您可以将其重写为:

a = 2
a = a.send("+", 2)
Run Code Online (Sandbox Code Playgroud)

赋值不是方法调用的一部分.


1您可以=通过define_method以下方式实际定义方法:

class Foo
  define_method('=') { |other| puts "`=' called with #{other}" }
end
Run Code Online (Sandbox Code Playgroud)

但这只是一种普通的方法.特别是,它不会也不能改变对象被赋予的变量或对象的标识:

 f = Foo.new
 #=> #<Foo:0x007ff20c0eeda8>
 f.send('=', 123)
 # `=' called with 123
 #=> nil
 f
 #=> #<Foo:0x007ff20c0eeda8>
Run Code Online (Sandbox Code Playgroud)