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

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

no implicit conversion from nil to integer 

当我使用该线

 manufacturer_cols < 'test'} 

我稍后在同一个循环中使用相同的行,它没有问题。

整个代码是

 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 < 'test'} else #it works fine here! manufacturer_cols <mapped_field.base_field_name } end end 

——- 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, “名”: “主题”}} ]

隐式转换错误的解释

我不确定为什么你的代码会出现这个错误,但我可以准确地告诉你错误的含义,也许这会有所帮助。

Ruby中有两种转换: 显式隐式。

显式转换使用短名称,例如#to_s#to_i. 这些通常在核心中定义,并且它们一直被调用。 它们用于非字符串或非整数的对象,但可以转换为调试或数据库转换或字符串插值等。

隐式转换使用长名称,例如#to_str#to_int. 这种转换适用于非常类似字符串或整数的对象,只需要知道何时采用其自我forms。 这些转换从未或几乎从未在核心中定义过。 (Hal Fulton的The Ruby WayPathname标识为找到定义#to_str的理由的类#to_str 。)

即使NilClass定义了显式(短名称)转换器,也很难得到错误:

 nil.to_i => 0 ">>#{nil}<<" # this demonstrates nil.to_s => ">><<" 

您可以像这样触发它:

 Array.new nil TypeError: no implicit conversion from nil to integer 

因此,您的错误来自Ruby解释器中的C代码。 用C语言实现的核心类在需要Integer时会被赋予nil 。 它可能有#to_i但它没有#to_int ,因此结果是TypeError。

这似乎与任何与manufacturer_cols有关的事情完全无关。

我已经到了manufacturer_cols位,因为如果我评论了它,它运行正常。

但是,如果我注释掉了我在页面下方运行csv的部分,那么它也运行正常。

事实certificate,错误与检索尝试在base_field为零时附加有关。

我以为我可以用

 manufacturer_cols.each do | col |
    base_value = row [col [:row_index] .to_i]

   如果col [:merges]
        col [:merges] .each do | merge |
            base_value + = merge [:separator] .to_s + row [merge [:merge_row_index]]
       结束
   结束
结束

不幸的是,这导致了错误。 解决方案是

  base_value = base_value + merge [:separator] .to_s + row [merge [:merge_row_index]]

我希望这对某些人有所帮助,因为正如DigitalRoss所暗示的那样,这是一个非常疯狂的追逐,在这里引起了代码的原因以及原因。

通过API解析“tag /#{idnum} / parents”时出现此错误…通常,您会期望得到如下响应:

  { "parents": [ { "id": 8, "tag_type": "MarketTag", "name": "internet", "display_name": "Internet", "angellist_url": "https://angel.co/internet", "statistics": { "all": { "investor_followers": 1400, "followers": 5078, "startups": 13214 }, "direct": { "investor_followers": 532, "followers": 1832, "startups": 495 } } } ], "total": 1, "per_page": 50, "page": 1, "last_page": 1 

}

但当我抬头看着市场类别“成人”的父母时(原样),我得到了这个

 { "parents": [ ], "total": 0, "per_page": 50, "page": 1, "last_page": 0 } 

现在ruby允许发生这种事情的一些交互,但最终它抛出了关于隐式转换的错误

  parents.each do |p| stats = p['statistics']['all'] selector << stats['investor_followers'].to_i end selected = selector.index(selector.max) parents[selected]['id'] ***<--- CODE FAILED HERE end 

这对我来说很简单。

当我使用Scout应用程序收到此错误时,我的一个映射文件夹是header-1,当我从文件夹名称中删除连字符并使其成为header1时,错误就消失了。

由于某种原因,它不喜欢连字符……