在辅助方法中处理局部变量并返回另一个值

时间:2014-11-30 09:40:25

标签: ruby-on-rails ruby

如何将以下条件提取到方法中?

我希望两者都为变量设置一个新值并返回迭代项的值。

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

2 个答案:

答案 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真的是最好的解决方案。 然后,您可以将结果存储在更持久的变量中。