我是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