1

以下函数旨在接收一个数组数组并返回其子数组的最大值。

def temp(list)
  if list.all? { |i| i.kind_of?(Array) }
    return(list.each { |j| j.max })
  else
    return(list)
  end
end

所以给定一个这样的列表和函数调用:

x = [[1, 2], [3, 4]]

temp(x)

它应该返回 [2, 4],但它只返回原始数组 [[1, 2], [3, 4]]。我想知道这里出了什么问题。

谢谢

4

3 回答 3

3

each对数组的每个元素进行操作,然后返回(原始)数组。你想要的方法是map

def temp(list)
  if list.all? {|i| i.kind_of?(Array) }
    list.map {|j| j.max }
  else
    list
  end
end

x = [[1, 2], [3, 4]]
temp(x)
# => [2, 4]

然而,显式类型检查在 Ruby 中不是惯用的,它更喜欢鸭子类型。不要检查是否i是一个数组;只需检查它是否响应max

def temp(list)
  return list unless list.all? {|i| i.respond_to?(:max) }
  list.map(&:max)
end
于 2017-01-28T03:08:27.840 回答
1

如果你放宽all?要求,那么……</p>

尝试这个

def temp(list)
  list.map { |l| Array(l).max }
end

这是如何运作的?

  • Array(l)将数组变成数组
  • 并将其他对象转换为单元素数组
  • 并变成nil一个空数组
  • 因此我们总是可以调用max
于 2017-01-28T03:46:10.783 回答
0

在列表的每个成员上运行代码块后,您将返回列表本身。相反,您可以在函数内创建另一个列表并将值推max送到该列表中,然后返回它。

def temp(list)
  if list.all? { |i| i.kind_of?(Array) }
    maxlist=[]
    list.each { |j| maxlist << j.max }
    return maxlist
  else
    return(list)
  end
end

x = [[1, 2], [3, 4]]

puts temp(x)

这将按预期输出 2 和 4 。

于 2017-01-28T03:00:00.737 回答