【问题标题】:Hardcoding Ruby Enumerable#reduce - I have two methods, but only one works. Why?Hardcoding Ruby Enumerable#reduce - 我有两种方法,但只有一种有效。为什么?
【发布时间】:2020-04-18 01:09:10
【问题描述】:

我是新手,作为练习,我必须硬编码一个将数组作为参数的方法,如果该数组中的所有元素都是真值,则返回真值。如果不是,则为假。

def reduce_to_all_true(array)
  array.each do |index|
    if !index
      return false
    end
  return true
  end
end

如果任何元素为真,则返回真...

同时,以下内容:

def reduce_to_all_true(array)
  array.length.times { |index|
    if !array[index]
      return false
    end }
  return true
end

按预期运行。我无法解决的问题是为什么?在我公认的有限理解中,它们是等效的解决方案。有人可以帮我理解这一点吗?谢谢!

【问题讨论】:

  • 你的第一个例子使用if index 而不是if array[index] 像第二个
  • @rossta 虽然在每个块中命名元素index 绝对是个坏主意,但index 变量指的是元素而不是index 本身。所以除了名字不好,没有问题
  • 好点。我误读了。

标签: ruby each reduce


【解决方案1】:

在第一种方法中,return true#each 循环内,因此它将仅检查第一个元素并返回真或假。在第二个中,它在循环之后,因此只有当循环完全完成而没有找到任何错误的元素时,它才会返回 true。

def reduce_to_all_true(array)
  array.each do |index| # each loop starts here
    if !index
      return false
    end
  return true # this will return true if the first element of array is true
  end # and ends here
end

def reduce_to_all_true(array)
  array.length.times { |index| # times loop starts here
    if !array[index]
      return false
    end } #and ends here
  return true #this will return true only if the times loop finishes
end

【讨论】:

  • @LRB83 虽然它会起作用,但对于分布在多行的块使用大括号 { } 是个坏主意。阅读和反对风格指南更难:)
  • 感谢您的提示!在那种情况下,错误修正了,你认为 .each 方法是更好的实现吗?
  • @LRB83 对于你想做的事情来说,每个都是比时间更好的选择,但是这里有很多事情要解决,我认为这对于一个单一的 SO 问题来说可能过于宽泛,但请考虑使用unless 而不是if !,在最后一行省略return,并将块内的变量命名为index以外的其他名称
猜你喜欢
  • 2015-05-01
  • 2012-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-04
  • 1970-01-01
  • 2016-07-01
相关资源
最近更新 更多