2011-07-18 176 views
0

我正在创建一个类,然后尝试在其中执行一些操作,但由于某种原因,Ruby无法查看我在顶部定义的类变量,因此有任何想法?未定义变量错误

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 

感谢

回答

1

类变量必须@@为前缀,所以你需要重命名你的类变量。例如,需要将attr_hash重命名为@@attr_hash,无论是在班级正文中还是start

BTW,以防止每次覆盖的变量,你可以这样做:

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

这具有当@@attr_hash包含nilparseHashFormFile只调用的效果。

+0

啊我看到谢谢你的评论,你介意|| =做什么?我只见过||作为逻辑或。 –

+2

@Hunter:'a || = b'是'a = a ||的简写。 b',所以只有当'a'还没有真值时,它才是一个简单的方法来将'b'赋值给'a'。如果a.nil?'较长且较少惯用的版本将是'a = b'。 –

1

您定义它们的方式使它们位于函数之外的区域。这只是一个基本的范围问题 - 易于修复。

类变量以@@开头,如@@BASE_URL。请参阅variable scope reference

+0

谢谢你的链接 –