2

编辑:问题是无法在哈希中获取数组的数量,所以它可以是,x = 数组的数量。所以它可以用作 function.each_index{|x| 代码 }

尝试使用行数的索引作为重复操作 X 次的方式,具体取决于从 CSV 文件中提取的数据量。

终端发出

=> 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
4

3 回答 3

2

你没有做太多,但它似乎@releaseHashTable包含一个数组,而不是一个哈希。

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

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

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

其中productIdn是整数。要么您必须具体指定它们,要么(如果您不知道n)您必须引入一个循环来收集特定productId.

于 2012-12-07T12:09:53.270 回答
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
于 2012-12-07T12:28:18.377 回答
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
于 2012-12-07T12:16:19.927 回答