Как да се инициализира хеш, така че мога да го използвам в един метод? - рубин, хеш

Странно, че няма да уредя никаква информация за това навсякъде в интернет.

Имам клас метод, който трябва да добави нещо към хеш. Например:

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

Ако аз инициализирам хеш с @files = Hash.new по същия начин би направил изцяло нов хешвсеки път, когато се опитвам да добавя нещо към него, а не да добавя неща към него. Но когато премествам инициализацията от метода в самото тяло на класа, се появява грешка:

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

И така, как да инициализирам хеш, така че да го използвам по друг начин по-късно.

Поддържайте обяснението просто, моля, аз съм нов. Благодаря!

Отговори:

3 за отговор № 1

бих не винаги проверявайте за наличието на хеш в add/ и т.н.

Това изисква винаги проверка за хеш в нещо, което го очаква.

Ако класът е предназначен като обвивка за съхраняване на файлове, има смисъл да се създава при образуване на файлове,

class SomeClass
def initialize
@files = {}
end

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

Той не успява да създаде хеш в тялото на класа, защото това е в клас, не инстанция, ниво, напр.

class NotWhatYouExpect
@foo = "bar"
end

@foo е клас примерна променлива; тя принадлежи на клас NotWhatYouExpect отколкото инстанции от него.


2 за отговор № 2

Това прилича на метод на инстанция, а не на класов метод. Разликата е, че това е метод, който може да бъде наречен на конкретен пример на даден клас.

Във всеки случай можете да го направите

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

Това ще инициализира @files на празен хеш, освен ако променливата на потребителския модел не е налице (и не е невярна)


2 за отговор № 3

Опитайте тази:

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

Това ще добави нова двойка ключ-вал и ще върне пълния хеш.


1 за отговор № 4

Когато инициализирате член на потребителския модел (променлива, започваща с @) в декларацията на класа (не в рамките на даден метод) членът се инициализира като член на клас, а не неговите случаи.

За да инициализирате член за всяко копие, трябва да го направите вътре в метода за инициализиране:

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
# => {}

Най - известен