gpt4 book ai didi

ruby-on-rails - Ruby - 方法更改输入变量值

转载 作者:数据小太阳 更新时间:2023-10-29 08:37:39 24 4
gpt4 key购买 nike

我是 Ruby 的新手,我无法理解此方法中发生的事情。

我在 Rails Controller 中进行此调用 -

@arr = SomeClass.find_max_option(params[:x], @pos, params[:y], some_var)

我正在尝试将值返回给 @arr,这成功发生了,但是我在该方法中对 @pos 进行了操作也正在被带回;当我只是试图获取 @arr 的值时,@pos 的值会发生变化。

下面是方法的更多细节

#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

但是当方法完成并返回到 Controller 时,@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

最佳答案

不使用 collect!,只需使用 collect(不带 !)。因此,将您的方法重写为:

def self.find_max_option(x, pos, y, some_var)
pos.collect { |element|
(element == b) ? [c,d] : element
}
end

当使用 ! 版本的 collect 时,您将用 block 返回的值替换每个元素。但是,当使用 collect 而没有 ! 时,会创建一个新数组,并且调用 collect 的对象不会更改。查看文档:

collect!对比collect

在方法名末尾使用 ! 是 Ruby 中的常见做法。 This question是相关的,值得一看。

关于ruby-on-rails - Ruby - 方法更改输入变量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26285271/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com