如何在Ruby中映射和删除nil值

我有一个映射,它要么更改一个值,要么将其设置为nil。然后我想从列表中删除nil条目。这份清单不需要保存

这就是我目前拥有的:

#一个简单的示例函数,返回值或nil
def变换(n)
兰德>0.5 ? n*10:nil}
终止
items.map!{x |变换(x)}[1,2,3,4,5]=>[10,无,30,40,无]
物品。拒绝!{| x | x.nil?}[10,nil,30,40,nil]=>[10, 30, 40]

我知道我可以做一个循环,然后有条件地收集到另一个数组中,如下所示:

new\u items=[]
项目。每个项目都有| x|
x=变换(x)
新项目。附加(x),除非x.nil?
终止
项目=新项目

但它似乎没有那么地道。有没有一种很好的方法可以将函数映射到一个列表上,同时删除/排除nil

您可以使用compact

[1,nil,3,nil,nil]
=>[1, 3] 

我想提醒大家,如果您得到一个数组,其中包含nils作为map块的输出,并且该块尝试有条件地返回值,那么您就有了代码味道,需要重新考虑您的逻辑

例如,如果你正在做这样的事情:

[1,2,3]。地图{i|
如果i%2==0
我
终止
}
#=>[零,二,零]

那就不要。相反,在映射之前,拒绝你不想要的东西或选择你想要的:

[1,2,3]。选择{i{i%2==0}。映射{i|
我
}
#=>[2]

我考虑使用 Cuffy清理混乱,作为最后的努力,以摆脱我们没有正确处理的事情,通常是因为我们不知道接下来会发生什么。我们应该始终知道在我们的程序中抛出了什么样的数据;意外/未知数据不正确。每当我在正在处理的数组中看到nil时,我都会深入研究它们存在的原因,看看是否可以改进生成数组的代码,而不是让Ruby浪费时间和内存来生成nil,然后在数组中筛选以稍后删除它们

“就我的$%0.2f.”%[2.到\u f/100]

发表评论