我听说在循环时修改数组是不可能的。但是我想在这里发帖来检查我是不是错过了一些技巧或什么的。
让我给出一些代码来解释。这种方法应该采取一系列“成分”,即面包片,然后做两个改变:烤面包,然后加入黄油。
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
不关心它给出的论点,代码进入无限循环。
我已经编辑了这个问题,使代码更简洁,更少伪代码。我还将标题更改为更具体
答案 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