以下函数用于接收数组数组并返回其子数组的最大值。
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]]。我想知道这里出了什么问题。
由于
答案 0 :(得分: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
答案 1 :(得分:1)
如果放宽all?
要求,那么......
试试这个
def temp(list)
list.map { |l| Array(l).max }
end
这是如何运作的?
Array(l)
将数组转换为数组nil
变为空数组max
答案 2 :(得分:0)
在列表的每个成员上运行代码块后,您将返回列表本身。相反,您可以在函数内部创建另一个列表,并将[Then(@"the expected value is '(.*)'")]
public void ThenTheExpectedValueIs(string[] p0)
{
//ScenarioContext.Current.Pending();
Assert.AreEqual(25, Convert.ToInt32(p0[0]));
Assert.AreEqual(36, Convert.ToInt32(p0[1]));
Assert.AreEqual(79, Convert.ToInt32(p0[2]));
}
值推送到该列表中,并将其返回。
max
这将按预期输出2和4。