在尝试向数组添加任何内容时,没有从nil到整数的隐式转换

ped*_*ete 12 ruby hash

我正在尝试构建一个相当复杂的哈希,我很奇怪得到错误

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 WayPathname标识为找到定义理由的类之一#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.

  • 感谢您对DigitalRoss的回复,以及您上面的评论.我已经搜索了错误实际意味着什么,但是你的描述比我在搜索中看到的任何其他内容都要清晰得多. (2认同)