如何初始化哈希所以我可以在方法中使用它?

时间:2014-11-10 13:52:50

标签: ruby hash

奇怪的是,我冷静地在互联网上找不到任何相关信息。

我有一个类方法,应该在哈希中添加一些东西。例如:

def add_file(name, file)
  @files[name] = file
end

如果我用同一个方法用@files = Hash.new初始化哈希值,那么每次我尝试向它添加一些东西时都会产生一个全新的哈希,而不是向它添加内容。但是当我在类体本身中将初始化移出方法时,会出现错误:

in 'add_file': undefined method '[]=' for nil:NilClass (NoMethodError)

那么我如何初始化哈希以便以后可以在另一种方法中使用它。

保持解释简单,拜托,我是新的。谢谢!

4 个答案:

答案 0 :(得分:3)

总是检查add / etc方法中是否存在哈希值。

这需要始终检查任何需要它的哈希值。

如果该类是作为文件存储的包装器,那么在实例化时创建它是有意义的,例如,

class SomeClass
  def initialize
    @files = {}
  end

  def add_file(name, file)
    # Etc.
  end
end

它在类体中创建哈希失败,因为它位于,而不是实例,等级,例如,

class NotWhatYouExpect
  @foo = "bar"
end

@foo实例变量;它属于 class NotWhatYouExpect而非实例

答案 1 :(得分:2)

试试这个:

    def add_file(name, file)
      @files || = {} #Checking if hash is initialized. If not initializing
      @files[name] = file #adding element
      @files #returning hash
    end

这将添加一个新的键值对并返回完整的哈希值。

答案 2 :(得分:2)

这看起来像是一个实例方法,而不是一个类方法。区别在于它是一种可以在类的特定实例上调用的方法。

无论如何,你可以做到

def add_file(name, file)
  @files ||= {}
  @files[name] = file
end

除非实例变量存在(而不是假),否则会将@files初始化为空哈希

答案 3 :(得分:1)

在类声明(不在方法内)初始化实例成员(以@开头的变量)时,成员被初始化为的成员,而不是实例

要初始化每个实例的成员,您需要在initialize方法中执行此操作:

class MyTest

  @class_hash = Hash.new

  def initialize()
    @instance_hash = Hash.new
  end

  def class_hash
    @class_hash
  end

  def instance_hash
    @instance_hash
  end

  def self.class_hash
    @class_hash
  end
end

puts MyTest.new.class_hash
# => nil
puts MyTest.new.instance_hash
# => {}
puts MyTest.class_hash
# => {}