奇怪的是,我冷静地在互联网上找不到任何相关信息。
我有一个类方法,应该在哈希中添加一些东西。例如:
def add_file(name, file)
@files[name] = file
end
如果我用同一个方法用@files = Hash.new
初始化哈希值,那么每次我尝试向它添加一些东西时都会产生一个全新的哈希,而不是向它添加内容。但是当我在类体本身中将初始化移出方法时,会出现错误:
in 'add_file': undefined method '[]=' for nil:NilClass (NoMethodError)
那么我如何初始化哈希以便以后可以在另一种方法中使用它。
保持解释简单,拜托,我是新的。谢谢!
答案 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
# => {}