нет неявного преобразования из nil в integer - при попытке добавить что-либо в массив

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

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":"Category","id":1,"name":"Category"}},{"base_field":{"base_field_name":"Description","id":3,"name":"Short_Description"}},{"base_field":{"base_field_name":"exactSKU","id":5,"name":"Item_SKU"}},{"base_field":{"base_field_name":"Markup","id":25,"name":"Retail_Price"}},{"base_field":{"base_field_name":"Family","id":26,"name":"Theme"}}]

4 ответов


Объясняются Неявные Ошибки Преобразования

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

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

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

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

довольно трудно получить вашу ошибку, даже 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, передается a nil, когда он ожидает Integer. У него может быть #to_i но у него нет #to_int и в результате исключение TypeError.


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

Я приехал в manufacturer_cols бит, потому что, если я прокомментировал это, все прошло нормально.

однако, если я прокомментировал часть, в которой я пробежал csv дальше по странице, он также работал нормально.

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

I думал, что смогу использовать

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


я получил эту ошибку при анализе через 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, ошибка исчезла.

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