Ruby 未定义变量错误

Ruby 未定义变量错误,ruby,Ruby,我正在创建一个类,然后尝试在其中执行一些操作,但是由于某种原因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

我正在创建一个类,然后尝试在其中执行一些操作,但是由于某种原因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

谢谢

类变量必须以
@
作为前缀,因此您需要重命名类变量。例如,
attr\u hash
需要重命名
@@attr\u hash
,无论是在类主体中还是在
start

顺便说一句,为了防止每次都覆盖变量,您可以这样做:

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

这样做的效果是,只有当
@@attr\u hash
包含
nil

类变量必须以
@
作为前缀时,才会调用
parseHashFormFile
,因此需要重命名类变量。例如,
attr\u hash
需要重命名
@@attr\u hash
,无论是在类主体中还是在
start

顺便说一句,为了防止每次都覆盖变量,您可以这样做:

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

这样做的效果是,只有当
@@attr\u hash
包含
nil
时,才会调用
parseHashFormFile
。您并没有像想象的那样创建实例变量。有关实例和类变量在Ruby中如何工作的说明,请参阅。

您并没有按照自己的想法创建实例变量。有关实例和类变量在Ruby中如何工作的说明,请参阅。

您定义它们的方式使它们位于函数外部的区域。这只是一个基本的范围问题,很容易解决


类变量以
@
开头,如
@@BASE\u URL
中所示。请参阅。

您定义它们的方式使它们位于函数外部的区域。这只是一个基本的范围问题,很容易解决


类变量以
@
开头,如
@@BASE\u URL
中所示。看。

啊,我明白了,谢谢你的评论,你介意解释一下| |=的作用吗?我只见过| |作为逻辑or。@Hunter:
a | |=b
a=a | | b
的简写,所以只有
a
没有真值时,才可以简单地将
b
赋值给
a
。如果A.nil?,较长且不太惯用的版本将是
A=b。啊,我明白了,谢谢你的评论,你介意解释一下| |=的作用吗?我只见过| |作为逻辑or。@Hunter:
a | |=b
a=a | | b
的简写,所以只有
a
没有真值时,才可以简单地将
b
赋值给
a
。如果A.nil?
,则较长且不太惯用的版本将是
A=b。