在循环中,将参数传递给`redo`以更改当前迭代的元素

时间:2016-05-09 03:28:03

标签: ruby

我听说在循环时修改数组是不可能的。但是我想在这里发帖来检查我是不是错过了一些技巧或什么的。

让我给出一些代码来解释。这种方法应该采取一系列“成分”,即面包片,然后做两个改变:烤面包,然后加入黄油。

ingredients = ["bread", "toast"]
buttered_slices = ingredients.map do |ingredient|
  if ingredient.eql?("toast")
    next "buttered_toast"
  else
    # ideally the ingredient variable would be "toast"
    # for the next iteration
    redo "toast"
  end
end

要清楚,这不起作用。 redo不关心它给出的论点,代码进入无限循环。

我已经编辑了这个问题,使代码更简洁,更少伪代码。我还将标题更改为更具体

2 个答案:

答案 0 :(得分:1)

为什么不这样解决:

def turn_each_ingredient_into_buttered_toast(ingredients)
  ingredients.map do |ingredient|
    unless ingredient.is_a?(Toast)
      ingredient = ingredient.to_toast
    end
    ingredient.to_buttered_toast
  end
end

您实际上并没有重做迭代,但是您获得了相同的结果。

另外值得注意的是,buttered_slices的分配以及next来电都是不必要的。

答案 1 :(得分:1)

除了@Albin提供的方法之外,可以使用redo实现相同的功能。你写了“理想的”成分“将'重做'为重做” - 只是这样做;

buttered_slices = ingredients.map do |ingredient|
  if ingredient.is_a?(Toast)
    next ingredient.to_buttered_toast
  else
    ingredient = ingredient.to_toast
    redo
  end
end

正如文档所述,redo保留了绑定,包括局部变量的绑定。

坦率地说,我不明白这种繁琐方法的原因是什么:

buttered_slices = ingredients.map do |ingredient|
  (ingredient.is_a?(Toast) ? ingredient : ingredient.to_toast).to_buttered_toast
end