Ruby2.3升2.7、Rails5.2升6.1报wrong element type nil错误如何解决
问题解答
报错行代码含义
你贴的报错行代码逻辑分两步:
- 调用
collect(Ruby中也叫map方法)遍历address_to_field_mapping哈希的所有键值对:- 对于每一组键
k、值v,如果传入参数var1中键k对应的取值不为空,就返回[v, var1[k]]格式的二元数组 - 如果
var1[k]是空值(nil),当前遍历项返回nil
- 对于每一组键
- 用
Hash[]方法把collect返回的集合转换成新的哈希,其中二元数组的第一个元素为新哈希的键,第二个为新哈希的值。
报错触发原因
这个错误是Ruby版本升级带来的语法校验收紧导致的:
- 你升级前用的Ruby 2.3版本中,
Hash[]方法接收包含nil元素的数组时,会自动忽略所有nil值,只把合法的二元数组转为哈希键值对,不会报错 - Ruby 2.4及更高版本(你当前用的2.7属于这个范围)对
Hash[]的入参校验更严格,要求传入的数组元素必须全是二元数组,只要遇到nil这类非数组元素,就会抛出wrong element type nil at 0 (expected array)错误 - 你的代码中只要出现任意一个
var1[k]为nil的情况,collect返回的数组就会混入nil元素,触发高版本Ruby的校验报错。
修复方案
最简单的修复是在collect后面加compact方法过滤掉所有nil元素,再传给Hash[]:
fields = Hash[address_to_field_mapping.collect{|k,v| [v, var1[k]] unless var1[k].nil?}.compact]
如果要适配Ruby 2.7的新特性,可以用更简洁的filter_map方法,直接过滤掉返回nil的遍历项再转哈希:
fields = address_to_field_mapping.filter_map { |k, v| [v, var1[k]] unless var1[k].nil? }.to_h
额外提示:你贴的代码中address_to_field_mapping哈希的第一行定义末尾缺少逗号,会触发语法报错,建议检查补全。
内容的提问来源于stack exchange,提问作者Navid Rayhan
相关产品推荐
相关产品推荐

