0

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

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

处理程序加载:

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

我确信这与对象的范围有关,但我对如何使其他类可以访问和修改原始对象感到困惑。

编辑:也许这是一个不好的例子。我正在使用字符串来帮助我理解变量/对象范围的工作原理,但在我的实际程序中,它不是字符串。

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

4

4 回答 4

0

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

执行此行时:

@testobject = @testobject + " Modified!"

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

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

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

试试看:

def load(testobject)
  testobject.replace(testobject + " Modified!")
end
于 2013-03-01T19:52:02.767 回答
0

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

在处理程序范围内

@testobject = @testobject + " Modified!" 

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

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

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

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

于 2013-03-01T20:20:18.627 回答
0

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

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

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

于 2013-03-01T22:14:09.427 回答
-1
@testobject = 'This is a string.'
callback = Proc.new {|suffix| @testobject = @testobject + suffix}
handler.load(callback)

def load(callback)
    callback.call(' Modified!')
end
于 2013-03-01T19:55:53.520 回答