2013-03-01 84 views
0

我想取一个对象,然后在一个方法中修改另一个对象,但它没有返回更新后的值。这是最好的例子来说明:使用远程方法修改对象

@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,让它运行适当的方法来更改“流”对象上的设置。

回答

0

只能通过自己的方法来修改你的对象。对于字符串,它可能是replacegsub。例如,对于阵列,它可能是<<方法。在处理程序

@testobject = @testobject + " Modified!" 

装置的范围

“分配@testobject + " Modified!到处理器@testobject的实例的实例变量”,它不修改@testobject。

顺便说一句,您使用哪个版本的红宝石?红宝石1.9.3不能解释

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

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

+0

完美。事实上,一个对象只能通过他们的方法进行修改,这对我来说非常有帮助。谢谢! – Jericon 2013-03-01 20:31:39

+0

从@testobject'+'_is_ a [方法](http://www.ruby-doc.org/core-2.0/String.html#method-i-2B),它只是产生一个新的对象,并没有修改@testobject。 '<<'方法会改变@testobject。 – steenslag 2013-03-01 22:06:33

0

这是因为你把@testobject作为参数名。

当执行该行:

@testobject = @testobject + " Modified!" 

真正的参数名称由实例变量阴影。

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

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

试一下:

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

我编辑我的问题是更具体的,我实际上不使用一个字符串,只是使用它进行测试。 – Jericon 2013-03-01 20:06:09

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

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

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

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

<<是一个不同诱变方法,它修改@testobject变量引用的对象。