我正在尝试构建一个相当复杂的哈希,我很奇怪得到错误
no implicit conversion from nil to integer
Run Code Online (Sandbox Code Playgroud)
当我使用该线
manufacturer_cols << {:field => 'test'}
Run Code Online (Sandbox Code Playgroud)
我稍后在同一个循环中使用相同的行,它没有问题.
整个代码是
manufacturer_cols=[]
manufacturer_fields.each_with_index do |mapped_field, index|
if mapped_field.base_field_name=='exactSKU'
#this is where it is breaking, if I comment this out, all is good
manufacturer_cols << { :base_field=> 'test'}
else
#it works fine here!
manufacturer_cols << { :base_field=>mapped_field.base_field_name }
end
end
Run Code Online (Sandbox Code Playgroud)
------- manufacturer_fields的值--------
[{ "base_field":{ "base_field_name": "类别", "ID":1, "名称": "类别"}},{ "base_field":{ "base_field_name": "描述", "ID":3 , "姓名": "SHORT_DESCRIPTION"}},{ "base_field":{ "base_field_name": "exactSKU", "ID":5 "名称": "Item_SKU"}},{ "base_field":{ "base_field_name" "标记", "ID":25, "名": "Retail_Price"}},{ "base_field":{ "base_field_name": "家庭", "ID":26, "名": "主题"}} ]
Dig*_*oss 58
我不确定为什么你的代码会出现这个错误,但我可以准确地告诉你错误的含义,也许这会有所帮助.
Ruby中有两种转换:显式和隐式.
显式转换使用短名称,例如#to_s
或者#to_i.
这些通常在核心中定义,并且它们一直被调用.它们用于非字符串或非整数的对象,但可以转换为调试或数据库转换或字符串插值等.
隐式转换使用长名称,例如#to_str
或者.#to_int.
这种转换适用于非常类似于字符串或整数的对象,并且只需要知道何时采用其自我修改的形式.这些转换从未或几乎从未在核心中定义.(Hal Fulton的The Ruby Way将Pathname标识为找到定义理由的类之一#to_str
.)
即使NilClass
定义了显式(短名称)转换器,也很难得到错误:
nil.to_i
=> 0
">>#{nil}<<" # this demonstrates nil.to_s
=> ">><<"
Run Code Online (Sandbox Code Playgroud)
您可以像这样触发它:
Array.new nil
TypeError: no implicit conversion from nil to integer
Run Code Online (Sandbox Code Playgroud)
因此,您的错误来自Ruby解释器中的C代码.用C语言实现的核心类正在被nil
期待的时候传递给它Integer
.它可能有一个,#to_i
但它没有a#to_int
,因此结果是 TypeError.