我试图获取一个对象,然后在另一个对象的方法中修改它,但它没有返回更新的值。最好用一个例子来解释:
@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”对象的设置。
答案 0 :(得分:0)
这是因为您将@testobject
作为参数名称。
执行此行时:
@testobject = @testobject + " Modified!"
真实参数名称由实例变量遮蔽。
但是,即使您删除了@,也只会影响变量的本地副本。
您可以使用String#replace
有效地更新字符串。
试试:
def load(testobject)
testobject.replace(testobject + " Modified!")
end
答案 1 :(得分:0)
您只能通过他们的方法修改对象。对于字符串,可以是replace
或gsub
。例如,对于数组,它可以是<<
方法。
在处理程序的范围
@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