循环期间Ruby数组变量引用丢失

时间:2014-02-21 02:57:19

标签: ruby arrays scope

我正在Ruby 2.1中为电子表格编写一个解析例程。代码通过第一组定价数据正常工作。不幸的是,在第五个循环通过数据表时,在处理第二组定价数据时,未设置变量termtable,即使@tmptermtables在第72行的此语句中由shift方法修改:termtable = @tmptermtables.shift if termtable.empty?这可能是范围问题,我希望有人可以向我解释为什么参考丢失。

以下是代码的副本。提前谢谢你借给我你的大脑。

def sp_parser()
begin

pricing_date = Date.new(2014,2,7)
tz = DateTime.parse(Time.now.to_s).strftime('%z')
expires = DateTime.new(pricing_date.year,pricing_date.mon,pricing_date.mday,17,00,00,tz)

datatable = Array.new
datatable << ["Zone","Business - Low Load Factor",nil,nil,nil,"Business - Medium Load Factor",nil,nil,nil,"Business - High Load Factor",nil,nil,nil]
datatable << [nil,6,9,12,15,6,9,12,15,6,9,12,15]
datatable << [nil,"Daily Pricing",nil,nil,nil,"Daily Pricing",nil,nil,nil,"Daily Pricing",nil,nil,nil]
datatable << ["COAST",6.41,6.55,6.19,6.01,6.07,6.18,5.88,5.74,5.63,5.71,5.48,5.37]
datatable << ["NORTH",6.58,6.74,6.35,6.15,6.02,6.13,5.85,5.68,5.61,5.68,5.47,5.33]
datatable << [nil,3/1/2014,nil,nil,nil,3/1/2014,nil,nil,nil,3/1/2014,nil,nil,nil]
datatable << ["COAST",7.08,6.53,6.20,6.00,6.63,6.17,5.89,5.73,6.06,5.69,5.49,5.36]
datatable << ["NORTH",7.34,6.72,6.36,6.13,6.60,6.10,5.86,5.66,6.06,5.65,5.48,5.31]

loadprofiles = Array.new
termtables = Array.new
pvalue = 0
load_factor_found = false
daily_pricing_found = false
dataset = []


datatable.each_index {|row|
  record = datatable[row]
  termtable = Array.new
  @tmptermtables = Array.new(termtables)
  @tmploadprofiles = Array.new(loadprofiles)

  record.each_index {|col|
    val = record[col]
    ## Build the load profile table
    loadprofiles << "LOW" if val.to_s.downcase.match(/ low/)
    loadprofiles << "MEDIUM" if val.to_s.downcase.match(/medium/)
    loadprofiles << "HIGH" if val.to_s.downcase.match(/high/)
    load_factor_found = true if val.to_s.downcase.match(/load factor/)
    daily_pricing_found = true if val.to_s.downcase.match(/daily pricing/)

    ## Build the term tables for each load profile
    if load_factor_found and !daily_pricing_found
      isinteger = val.is_a? Integer
      if isinteger
        cvalue = val
        if cvalue > pvalue
          termtable << cvalue
          pvalue = cvalue
          termtables << termtable if col == record.length - 1
        else
          unless termtable.empty?
            termtables << termtable
            termtable = []
            termtable << cvalue
            pvalue = cvalue
          end
        end
      else
        cvalue = 0
      end
    end


    if daily_pricing_found
      @start_date = pricing_date if val.to_s.downcase.match(/daily pricing/)
      @start_date = val if val.is_a? Date
      @zone = "CenterPoint" if val.to_s.downcase.match(/coast/)
      @zone = "Oncor" if val.to_s.downcase.match(/north/)

      if val.is_a? Float
        @load = @tmploadprofiles.shift if termtable.empty?

# Here is where it breaks
        termtable = @tmptermtables.shift if termtable.empty?

        term = termtable.shift unless termtable.empty?
        price = (val/100).round(4)
        r = {
            :loaded => Time.now,
            :start => @start_date,
            :load => @load,
            :term => term,
            :zone => @zone,
            :price => price,
            :expiration =>  expires,
            :product => "Fixed"
        }
        dataset << r
      end
    end
  }
}


return dataset
  rescue => err
    puts "\n" + DateTime.parse(Time.now.to_s).strftime("%Y-%m-%d %r") + "  Exception: #{__callee__} in #{__FILE__} generated an error: #{err}\n"
    err
  end
end

x = sp_parser()

0 个答案:

没有答案