Wie initialisiere ich Hash, damit ich es in einer Methode verwenden kann? - Rubin, Hasch

Seltsamerweise finde ich keine Informationen dafür im Internet.

Ich habe eine Klassenmethode, die etwas zu einem Hash hinzufügen soll. Beispielsweise:

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

Wenn ich den Hash mit initialisieren @files = Hash.new in der gleichen Methode würde es einen ganz neuen Hash machenJedes Mal versuche ich, etwas hinzuzufügen, anstatt etwas hinzuzufügen. Aber wenn ich die Initialisierung aus der Methode im Klassenkörper selbst verschiebe, kommt es zu einem Fehler:

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

Also wie initialisiere ich den Hash, damit ich ihn später in einer anderen Methode verwenden kann.

Halten Sie die Erklärung einfach, bitte, ich bin neu. Danke!

Antworten:

3 für die Antwort № 1

Ich würde nicht Überprüfen Sie immer das Vorhandensein des Hashes in der add/ etc Methoden.

Dies erfordert immer Überprüfen auf den Hash in allem, was es erwartet.

Wenn die Klasse als Wrapper für einen Dateispeicher gedacht ist, ist es nur sinnvoll, sie bei Instanziierung zu erzeugen, z.

class SomeClass
def initialize
@files = {}
end

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

Es scheitert mit der Hash-Erstellung im Klassenkörper, weil das bei der Klassenicht BeispielEbene, z.B.

class NotWhatYouExpect
@foo = "bar"
end

@foo ist ein Klasse Instanzvariable; es gehört zu den Klasse NotWhatYouExpect eher, als Instanzen davon.


2 für die Antwort № 2

Das sieht nach einer Instanzmethode und nicht nach einer Klassenmethode aus. Der Unterschied ist, dass es sich um eine Methode handelt, die für eine bestimmte Instanz einer Klasse aufgerufen werden kann.

In jedem Fall können Sie tun

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

Das initialisiert @files auf einen leeren Hash, es sei denn, die Instanzvariable ist vorhanden (und nicht falsch)


2 für die Antwort № 3

Versuche dies:

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

Dies fügt ein neues Schlüssel-Wert-Paar hinzu und gibt den vollständigen Hash zurück.


1 für die Antwort № 4

Wenn Sie ein Instanzelement initialisieren (eine Variable, die mit @) Innerhalb der Klassendeklaration (nicht innerhalb einer Methode) wird das Mitglied als Mitglied der Klasse, nicht seine Instanzen.

Um ein Mitglied für jede Instanz zu initialisieren, müssen Sie es innerhalb der Initialize-Methode ausführen:

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

Am beliebtesten