неявное преобразование из nil в целое число - при попытке добавить что-либо в массив - PullRequest
12 голосов
/ 25 мая 2011

Я пытаюсь создать довольно сложный хеш, и странно получаю ошибку

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

------- значение factory_fields --------

[{ "base_field": { "base_field_name": "Категория", "идентификатор": 1, "имя": "Категория"}}, { "base_field": { "base_field_name": "Описание", "идентификатор": 3," название ":" SHORT_DESCRIPTION "}}, {" base_field ": {" base_field_name ":" exactSKU», "идентификатор": 5, "название": "Item_SKU"}}, { "base_field": {"base_field_name": "Разметка", "идентификатор": 25, "имя": "Retail_Price"}}, { "base_field": { "base_field_name": "Семья", "идентификатор": 26, "имя": "Theme«}}]

Ответы [ 4 ]

58 голосов
/ 25 мая 2011

Объяснение неявных ошибок преобразования

Я не совсем уверен, почему ваш код получает эту ошибку, но я могу точно сказать, что означает эта ошибка, и, возможно, это поможет.

Тамв Ruby есть два вида преобразований: явные и неявные.

Явные преобразования используют короткое имя, например #to_s или #to_i.. Они обычно определяются вядро, и они называются все время.Они предназначены для объектов, которые не являются строками или не являются целыми числами, но могут быть преобразованы для отладки, перевода базы данных, интерполяции строк или чего-либо еще.

В неявных преобразованиях используется длинное имя, например #to_str или #to_int..преобразования предназначены для объектов, которые очень похожи на строки или целые числа и просто должны знать, когда принять форму их альтер эго.Эти преобразования никогда не или почти никогда не определяются в ядре.(Хэл Фултон Ruby Way идентифицирует Pathname как один из классов, который находит причину для определения #to_str.)

Довольно сложно получить вашу ошибку,Even NilClass определяет явные (короткие имена) конвертеры:

nil.to_i
=> 0

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

Вы можете запустить его так:

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

Следовательно, ваша ошибка исходит из кода C внутри интерпретатора Ruby.Базовый класс, реализованный в C, получает nil, когда он ожидает Integer.Он может иметь #to_i, но не имеет #to_int, поэтому результатом является TypeError.

0 голосов
/ 12 ноября 2014

Это было простое исправление для меня.

Когда я получал эту ошибку с помощью приложения Scout, одна из моих сопоставленных папок была header-1, когда я удалил дефис из имени папки и сделал его header1, ошибка исчезла.

По какой-то причине дефису не понравился ...

0 голосов
/ 06 августа 2012

Я получил эту ошибку при разборе через API для "tag / # {idnum} / parent" ... Обычно вы ожидаете такой ответ:

 {

"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

}

Теперь рубин позволил ряду взаимодействий с этой вещью произойти, но в конечном итогевыкинуло ошибку о неявном преобразовании

    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
0 голосов
/ 25 мая 2011

Похоже, это было совершенно не связано ни с чем, что в конце концов имело какое-либо отношение к factory_cols.

Я прибыл на бит factory_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, это была довольно дикая погоня за гвоздями, выясняющая, где в коде это вызывается и почему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...