2012-12-07 106 views
2

编辑:问题是无法获取散列内数组的数量,因此它可以是x =数组量。所以它可以用作function.each_index {| x |代码}无法将符号转换为散列表中的整数

尝试使用行的量的指数为依赖于有多少数据从CSV文件拉出重复次数的动作X量的一种方式。

终端发出

=> Can't convert symbol to integer (TypeError) 

完全错误:

=> ~/home/tests/Product.rb:30:in '[]' can't convert symbol into integer (TypeError) from ~home/tests/Product.rub:30:in 'getNumbRel' 
from test.rb:36:in '<main>' 

功能是执行的操作是:

def getNumRel 
    if defined? @releaseHashTable 
    return @releaseHashTable[:releasename].length 
    else 
     @releaseHashTable = readReleaseCSV() 
     return @releaseHashTable[:releasename].length 
    end 
end 

CSV数据拉只是一个数组的哈希,没什么时髦的。

def readReleaseCSV() 
    $log.info("Method "+"#{self.class.name}"+"."+"#{__method__}"+" has started") 
    $log.debug("reading product csv file") 
    # Create a Hash where the default is an empty Array 
    result = Array.new 
    csvPath = "#{File.dirname(__FILE__)}"+"/../../data/addingProdRelProjIterTestSuite/releaseCSVdata.csv" 
    CSV.foreach(csvPath, :headers => true, :header_converters => :symbol) do |row| 
    row.each do |column, value| 
     if "#{column}" == "prodid" 
     proHash = Hash.new { |h, k| h[k] = [ ] } 
     proHash['relid'] << row[:relid] 
     proHash['releasename'] << row[:releasename] 
     proHash['inheritcomponents'] << row[:inheritcomponents] 

     productId = Integer(value) 
     if result[productId] == nil 
      result[productId] = Array.new 
     end 

     result[productId][result[productId].length] = proHash 
     end 
    end 
    end 
    $log.info("Method "+"#{self.class.name}"+"."+"#{__method__}"+" has finished") 
    @productReleaseArr = result 
end 
+0

你可以加回溯 – krichard

+0

@kritchard mhm也许是noob问题,但究竟是回溯? – samayres1992

+0

整个错误消息。 –

回答

2

对不起,无法抗拒,清理你的方法。

# empty brackets unnecessary, no uppercase in method names 
def read_release_csv 
    # you don't need + here 
    $log.info("Method #{self.class.name}.#{__method__} has started") 
    $log.debug("reading product csv file") 
    # you're returning this array. It is not a hash. [] is preferred over Array.new 
    result = [] 
    csvPath = "#{File.dirname(__FILE__)}/../../data/addingProdRelProjIterTestSuite/releaseCSVdata.csv" 
    CSV.foreach(csvPath, :headers => true, :header_converters => :symbol) do |row| 
    row.each do |column, value| 
     # to_s is preferred 
     if column.to_s == "prodid" 
     proHash = Hash.new { |h, k| h[k] = [ ] } 
     proHash['relid'] << row[:relid] 
     proHash['releasename'] << row[:releasename] 
     proHash['inheritcomponents'] << row[:inheritcomponents] 
     # to_i is preferred 
     productId = value.to_i 
     # this notation is preferred 
     result[productId] ||= [] 
     # this is identical to what you did and more readable 
     result[productId] << proHash 
     end 
    end 
    end 
    $log.info("Method #{self.class.name}.#{__method__} has finished") 
    @productReleaseArr = result 
end 
+0

哈哈谢谢,我一直都没有脚本化ruby,我只知道基础知识。这只是一个清理或者它是一个解决方案? – samayres1992

+0

嘿,它也燃烧了我的眼睛。考虑到其他代码,我希望更进一步,因为似乎有太多的数据结构,并且从一个转换到另一个。它需要通过面向对象的方式进行OO操作,例如Product类等域对象。 –

2

你还没有太多去,但现在看来,@releaseHashTable包含数组,而不是一个哈希值。

更新:根据您发布的实现,您可以看到productId是一个整数,并且readReleaseCSV()的返回值是一个数组。

为了得到你想要的releasename,你必须这样做:

@releaseHashTable[productId][n][:releasename] 

其中productIdn是整数。要么你必须具体指定它们,要么(如果你不知道n),你必须引入一个循环来收集特定productId的所有产品的所有发行版名称。

+0

嗯也许这是问题,这对我来说有点令人困惑,因为我没有编写大部分脚本,我只是将更改应用于之前编写的一些脚本。也许我对它是如何工作的理解是我出错的地方。 – samayres1992

1

这是马克托马斯的意思是:

> a = [1,2,3] # => [1, 2, 3] 
> a[:sym] 
TypeError: can't convert Symbol into Integer 
# here starts the backstrace 
    from (irb):2:in `[]' 
    from (irb):2 

数组是只有像这样a[1]此获取从阵列
你回报的阵列而这就是为什么你的代码没有第二个元素的索引访问:

#.... 
result = Array.new 
#.... 
@productReleaseArr = result 
# and then later on you call 
@releaseHashTable = readReleaseCSV() 
@releaseHashTable[:releasename] # which gives you TypeError: can't convert Symbol into Integer 
+0

啊我看到误解了,函数取了应该提供数组数的row.length。这是我在测试中需要使用的。 – samayres1992

相关问题