如何将以下条件提取到方法中?
我希望两者都为变量设置一个新值并返回迭代项的值。
my_variable = 0
collection_one.each do |item|
if item.some_attribute != my_variable
my_variable = item.some_attribute
item.some_attribute
end
# do other stuff
end
collection_two.each do |item|
if item.some_attribute != my_variable
my_variable = item.some_attribute
item.some_attribute
end
# do other stuff
end
答案 0 :(得分:1)
my_variable
的值不会在下一次迭代中持续存在,因为它在第一个each
方法中被覆盖。为此你可以这样做:
my_variable = 0
collection_one.each_wth_object do |item, obj|
if item.some_attribute != my_variable
obj << [item.some_attribute, my_variable]
my_variable = item.some_attribute
item.some_attribute
end
# do other stuff
end
my_variable = 0 # define it again
collection_two.each_with_object([]) do |item, obj|
if item.some_attribute != my_variable
obj << [item.some_attribute, my_variable]
my_variable = item.some_attribute
item.some_attribute
end
# do other stuff
end
此处obj
将保存每个[[item.some_attribute, my_variable], [...], [..],..]
内不同数组数组的值:each_with_object
。
答案 1 :(得分:0)
已经提供了上述答案。
我的建议是写方法 - 在其中你可以保证结果。
如果你需要一个持久变量,你可以使用@ivar。
喜欢,改变:
my_variable = 0
到
@my_variable = 0
在其他地方你有my_variable,用@my_variable替换。然后呢 应该工作。
你也可以滥用ARRAY常量来存储结果。
ARRAY_RESULT_VALUES = []
ARRAY_RESULT_VALUES << result_from_first_method
ARRAY_RESULT_VALUES << result_from_second_method
尝试确定首先要使用的路径。当然是 $ global变量也是可能的,但不是必需的 难看。
您也可以尝试继续使用本地变量 在那里发现了问题:
“我试图返回[item.some_attribute,my_variable],但新的my_variable值不会持续到下次运行该方法时.. - Numbers 1小时前” (顺便说一下,你编写了方法,但在你上面展示的代码中,你永远不会 使用 def ?)
这是有道理的,因为局部变量,顾名思义, 将仅限于它所绑定的范围/方法的本地。在你的 它在第一次运行时存在,在后续运行时存在 文件将被重置为nil。
我认为@ivar真的是最好的解决方案。 然后,您可以将结果存储在更持久的变量中。