Ruby 在循环中,作为参数传递给'redo',以更改当前迭代';s元素

Ruby 在循环中,作为参数传递给'redo',以更改当前迭代';s元素,ruby,Ruby,我听说在数组上循环时不可能修改数组。但我想在这里发帖子,确认我没有错过什么把戏或什么 让我给你一点代码来解释。这种方法需要一系列的“配料”,即面包片,然后做两个改变:烤面包,然后添加黄油 ingredients = ["bread", "toast"] buttered_slices = ingredients.map do |ingredient| if ingredient.eql?("toast") next "buttered_toast" else # idea

我听说在数组上循环时不可能修改数组。但我想在这里发帖子,确认我没有错过什么把戏或什么

让我给你一点代码来解释。这种方法需要一系列的“配料”,即面包片,然后做两个改变:烤面包,然后添加黄油

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
不关心给定的参数,代码进入无限循环


我对这个问题进行了一些编辑,使代码更加简洁,不像伪代码那样。我还将标题更改为更具体的

为什么不这样解决它:

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
实际上,您并没有重做迭代,但得到了相同的结果


另外值得注意的是,除了下一次调用
之外,对
黄油切片的赋值是不必要的。

为什么不这样解决呢:

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
实际上,您并没有重做迭代,但得到了相同的结果


同样值得注意的是,除了@Albin提供的方法外,对
butted_切片
的赋值以及
下一次
调用都是不必要的。

除了@Albin提供的方法外,还可以通过
重做
实现相同的功能。你写了“理想的”成分“将是重做的‘烤面包’”——就这么做

buttered_slices = ingredients.map do |ingredient|
  if ingredient.is_a?(Toast)
    next ingredient.to_buttered_toast
  else
    ingredient = ingredient.to_toast
    redo
  end
end
如文档所示,保留绑定,包括局部变量的绑定

坦率地说,我不明白为什么采用如此繁琐的方法:

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

除了@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
如文档所示,保留绑定,包括局部变量的绑定

坦率地说,我不明白为什么采用如此繁琐的方法:

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

尽管有你的例子,我不明白代码应该做什么。什么是涂黄油的吐司
吐司
(它们做什么/返回什么)?你为什么要检查成分的类型(还有哪些其他类别)?为什么要同时执行两个单独的操作?也许添加一些基本类(即
Toast
和另一个“component”类)以及输入数组和预期输出会有所帮助。尽管有你的例子,我不明白代码应该做什么。什么是涂黄油的吐司
吐司
(它们做什么/返回什么)?你为什么要检查成分的类型(还有哪些其他类别)?为什么要同时执行两个单独的操作?也许添加一些基本类(即,
Toast
和另一个“成分”类)以及输入数组和预期输出会有所帮助。
redo
是一个关键字,而不是一个方法。@cremno感谢您提到这一点。我很好奇是否有办法覆盖它。另外,我也不确定如何为
redo
编写包装器方法
redo
是一个关键字,而不是一个方法。@cremno感谢您提到这一点。我很好奇是否有办法覆盖它。还不确定如何为
redo
编写包装器方法。