Hunter McMillen
Hunter McMillen

Reputation: 61512

undefined variable error

I am creating a class, then trying to do some operations inside it, but for some reason Ruby cant see the class variables I defined at the top, any idea why?

class GoogleChart
  BASE_URL = "http://chart.apis.google.com/chart"
  URL_MAX_LENGTH = 2074 #found this online
  help_file = "help_attr_hash.txt"
  attr_file = "attr_hash.txt"
  attr_hash = nil
  help_hash = nil

  def parseHashFromFile(filename)
    return if filename == nil

    hash_array = []

    #open the file
    f = File.open(filename)

    #read each line and strip off '\r\n'
    f.each do |line|
      hash_array.push(line.chomp!)
    end

    #convert to a Hash {x => y}
    hash = Hash[*hash_array.flatten]

    return hash
  end

  def start
    attr_hash = parseHashFromFile(attr_file) ##Cant see attr_file
    help_hash = parseHashFromFile(help_file) ##Cant see help_file

    puts attr_hash
    puts help_hash
  end

  if __FILE__ == $0
    start()
  end
end

Thanks

Upvotes: 0

Views: 105

Answers (3)

jefflunt
jefflunt

Reputation: 33954

The way you've defined them makes them local to the area outside the functions. This is just a basic scope issue - easy to fix.

Class variables start with @@, as in @@BASE_URL. See variable scope reference.

Upvotes: 1

yan
yan

Reputation: 20982

You're not creating instance variables as you think you are. Refer to http://sporkmonger.com/2007/2/19/instance-variables-class-variables-and-inheritance-in-ruby for a description on how instance and class variables work in Ruby.

Upvotes: 1

DarkDust
DarkDust

Reputation: 92335

Class variables must be prefixed with @@, so you need to rename your class variables. For example, attr_hash needs to be renamed @@attr_hash, both in the class body and in start.

BTW, to prevent overwriting the variables every time, you could do this:

@@attr_hash ||= parseHashFromFile(@@attr_file)

This has the effect that parseHashFormFile is only called when @@attr_hash contains nil.

Upvotes: 1

Related Questions