Ruby Array.collect迭代器块条件使用异常:返回结果含nil原因排查
问题原因
你用的collect(Ruby中也叫map)方法的特性是:返回数组的长度永远和原输入数组完全一致,每个位置的取值就是原数组对应元素执行块代码后的返回值。
当i['title'].include?('night')条件不成立时,你写的块代码里只有i['title'] if 条件这个表达式,条件不成立时if表达式的返回值就是nil,所以最终返回数组里不满足条件的位置就会被nil填充,这就是你看到第一、第三个元素是nil的原因。
正确写法
你需要的是「先过滤符合条件的元素,再提取title值」,有几种常用实现方式:
- 先筛选再映射(兼容所有Ruby版本)
conditions = f.select { |i| i['title'].include?('night') }.map { |i| i['title'] }
- collect后去除nil(兼容所有Ruby版本)
conditions = f.collect { |i| i['title'] if i['title'].include?('night') }.compact
- 用
filter_map(Ruby 2.7及以上版本支持,自动过滤块返回的nil值,写法更简洁)
conditions = f.filter_map { |i| i['title'] if i['title'].include?('night') }
以上三种写法最终得到的结果都会是你预期的["Tuesday night: Cloudy. High plus 2.", "Tuesday night: Cloudy. High plus 2."],没有多余nil。
内容的提问来源于stack exchange,提问作者Rich_F
相关产品推荐
相关产品推荐

