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

时间:2011-05-25 03:57:42

标签: ruby hash

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

no implicit conversion from nil to integer

当我使用

行时
manufacturer_cols << {:field => '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 << { :base_field=> 'test'}


    else


        #it works fine here!
        manufacturer_cols << { :base_field=>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, “名”:“主题“}}]

4 个答案:

答案 0 :(得分: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
=> ">><<"

您可以这样触发:

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

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

答案 1 :(得分:0)

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

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

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

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

我以为我可以用

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

   if col[:merges]
       col[:merges].each do |merge|
           base_value += merge[:separator].to_s + row[merge[:merge_row_index]]
       end
   end
end

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

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

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

答案 2 :(得分:0)

我在解析“tag /#{idnum} / parents”的API时遇到了这个错误...通常情况下,你会得到这样的响应:

 {

"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

答案 3 :(得分:0)

这对我来说很简单。

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

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