我正在尝试构建一个相当复杂的哈希,我很奇怪地得到错误
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, “名”:“主题“}}]
答案 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时,错误就消失了。
由于某种原因,它不喜欢连字符......