使用远程方法修改对象

时间:2013-03-01 19:48:57

标签: ruby scope

我试图获取一个对象,然后在另一个对象的方法中修改它,但它没有返回更新的值。最好用一个例子来解释:

@testobject = "This is a string."
handler=Handler.new
handler.load(@testobject)
puts @testobject
=> "This is a string."

handler.load:

def load(@testobject)
  @testobject = @testobject + " Modified!"
end

我确定这与对象的范围有关,但我很难过如何使原始对象可以被其他类访问和修改。

编辑:这可能是个坏榜样。我使用字符串来帮助我理解变量/对象范围的工作原理,但在我的实际程序中,它不是字符串。

更具体地说,我有一个我正在使用的对象(“流”)。然后我有一个“处理程序”对象,就像一个插件,每个对象都需要修改第一个“流”对象。对于每个处理程序,我想调用handler.load,让它运行适当的方法来更改“stream”对象的设置。

4 个答案:

答案 0 :(得分:0)

这是因为您将@testobject作为参数名称。

执行此行时:

@testobject = @testobject + " Modified!"

真实参数名称由实例变量遮蔽。

但是,即使您删除了@,也只会影响变量的本地副本。

您可以使用String#replace有效地更新字符串。

试试:

def load(testobject)
  testobject.replace(testobject + " Modified!")
end

答案 1 :(得分:0)

您只能通过他们的方法修改对象。对于字符串,可以是replacegsub。例如,对于数组,它可以是<<方法。

在处理程序的范围

@testobject = @testobject + " Modified!" 

表示“将@testobject + " Modified!分配给Handler @testobject实例的实例变量”,它不会修改@testobject。

顺便问一下,您使用的是哪个版本的红宝石? ruby 1.9.3无法解释

def load(@testobject)
  @testobject = @testobject + " Modified!"
end

因为没有办法用实例变量声明方法作为参数。

答案 2 :(得分:0)

+方法会生成一个新字符串; @testobject变量一直引用旧变量。

def load(@testobject)
  @testobject = @testobject << " Modified!"
end

<<是一种变异方法,它确实修改了@testobject变量引用的对象。

答案 3 :(得分:-1)

@testobject = 'This is a string.'
callback = Proc.new {|suffix| @testobject = @testobject + suffix}
handler.load(callback)

def load(callback)
    callback.call(' Modified!')
end