如何转换" + ="红宝石的操作员

时间:2016-09-21 05:51:35

标签: ruby

我可以将"+""-""/"转换为运算符使用2.send("-",3)

但它不适用于"+="

a = 2
a += 2 #=> 4

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

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

如何解决这个问题?

1 个答案:

答案 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>