我是Ruby新手,並且無法理解此方法中發生了什麼。Ruby - 方法更改輸入變量值
我做在Rails控制器這一呼籲 -
@arr = SomeClass.find_max_option(params[:x], @pos, params[:y], some_var)
我試圖返回值@arr
,成功地發生了,不過我的操作做出@pos
該方法中被帶回以及; @pos
的值在我僅嘗試獲取@arr
的值時發生了變化。
下面是關於該方法
#before going into the method
@pos = [a,b]
def self.find_max_option(x, pos, y, some_var)
pos.collect! { |element|
(element == b) ? [c,d] : element
}
end
#new value of pos = [a, [c,d]] which is fine for inside in this method
... #some calculations not relevant to this question, but pos gets used to generate some_array
return some_array
但是,當結束該方法,並得到回控制器詳情的@pos
的值現在爲[A,[C,D]]爲好。
這是怎麼回事?我認爲pos
將與@pos
分開處理,並且價值不會帶回。作爲一種變通方法我剛纔創建的方法中的一個新的局部變量,但我想知道這是發生
#my workaround is to not modify the pos variable
pos_groomed = pos.collect { |element|
(element == b) ? [c,d] : element
}
end
您正在傳遞'@ pos'作爲參數,這意味着'pos'是對'@ pos'的引用。你可以在'collect!'之前設置'pos = pos.dup'或者只使用非破壞性的'collect'。你的代碼並不是直截了當,因爲你正在返回一個不存在的變量 – engineersmnky 2014-10-09 18:18:01
對於noob問題,我很抱歉,但這是所有Ruby方法的標準嗎?對方法中傳遞的參數進行更改傳播?所有參數默認都是輸入/輸出?我不記得這發生在Java中。 – 2014-10-09 18:20:53
不要抱歉,這不是一個簡單的問題,即使是這樣,你也不應該感到抱歉。檢查這個http://stackoverflow.com/questions/1872110/is-ruby-pass-by-reference-or-by-value它會幫助你與這個話題。 – Nobita 2014-10-09 18:26:27