加上等于红宝石发送消息

ors*_*rsi 6 ruby

我熟悉ruby send方法,但由于某种原因,我不能做这样的事情

a = 4
a.send(:+=, 1)
Run Code Online (Sandbox Code Playgroud)

出于某种原因,这不起作用.然后我尝试了类似的东西

a.send(:=, a.send(:+, 1))
Run Code Online (Sandbox Code Playgroud)

但这也行不通.通过'发送'解雇加等于什么的正确方法是什么?

Nei*_*ter 6

我认为基本选项只是:

a = a.send(:+, 1)
Run Code Online (Sandbox Code Playgroud)

那是因为send对于对象的消息.赋值修改变量,而不是对象.


可以通过一些元编程直接赋值给变量,但代码是复杂的,到目前为止我能找到的最好的是:

a = 1
var_name = :a
eval "#{var_name} = #{var_name}.send(:+, 1)"
puts a  # 2
Run Code Online (Sandbox Code Playgroud)

或者使用实例变量:

@a = 2
var_name = :@a
instance_variable_set( var_name, instance_variable_get( var_name ).send(:+, 1) )
puts @a  # 3
Run Code Online (Sandbox Code Playgroud)