2013-03-01 75 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變量引用的對象。