it-swarm.com.de

Wie man einen bestehenden Hash in Ruby

In Bezug auf das Hinzufügen eines key => value - Paares zu einem vorhandenen gefüllten Hash in Ruby arbeite ich mich gerade durch Apress 'Beginn Ruby und habe gerade das Kapitel mit den Hashes abgeschlossen.

Ich versuche, den einfachsten Weg zu finden, um mit Hashes die gleichen Ergebnisse zu erzielen wie mit Arrays:

x = [1, 2, 3, 4]
x << 5
p x
93
Tom

Wenn Sie einen Hash haben, können Sie ihm Elemente hinzufügen, indem Sie sie mit dem Schlüssel referenzieren:

hash = { }
hash[:a] = 'a'
hash[:a]
# => 'a'

Hier wie [ ] erstellt ein leeres Array, { } erstellt einen leeren Hash.

Arrays haben null oder mehr Elemente in einer bestimmten Reihenfolge, wobei Elemente dupliziert werden können. Hashes haben null oder mehr Elemente sortiert nach Schlüssel, wobei Schlüssel möglicherweise nicht dupliziert werden, die an diesen Positionen gespeicherten Werte jedoch.

Hashes in Ruby sind sehr flexibel und können Schlüssel von nahezu jedem Typ enthalten, den Sie darauf werfen können. Dies unterscheidet sie von den Wörterbuchstrukturen, die Sie in anderen Sprachen finden.

Es ist wichtig zu bedenken, dass die Spezifität eines Schlüssels eines Hash oft von Bedeutung ist:

hash = { :a => 'a' }

# Fetch with Symbol :a finds the right value
hash[:a]
# => 'a'

# Fetch with the String 'a' finds nothing
hash['a']
# => nil

# Assignment with the key :b adds a new entry
hash[:b] = 'Bee'

# This is then available immediately
hash[:b]
# => "Bee"

# The hash now contains both keys
hash
# => { :a => 'a', :b => 'Bee' }

Ruby on Rails verwirrt dies ein wenig, indem es HashWithIndifferentAccess bereitstellt, wo es frei zwischen Symbol- und String-Adressierungsmethoden konvertiert.

Sie können auch auf fast alles indizieren, einschließlich Klassen, Zahlen oder anderen Hashes.

hash = { Object => true, Hash => false }

hash[Object]
# => true

hash[Hash]
# => false

hash[Array]
# => nil

Hashes können in Arrays konvertiert werden und umgekehrt:

# Like many things, Hash supports .to_a
{ :a => 'a' }.to_a
# => [[:a, "a"]]

# Hash also has a handy Hash[] method to create new hashes from arrays
Hash[[[:a, "a"]]]
# => {:a=>"a"} 

Wenn es darum geht, Dinge in einen Hash einzufügen, können Sie dies nacheinander tun oder die Methode merge verwenden, um Hashes zu kombinieren:

{ :a => 'a' }.merge(:b => 'b')
# {:a=>'a',:b=>'b'}

Beachten Sie, dass dies nicht den ursprünglichen Hash ändert, sondern einen neuen zurückgibt. Wenn Sie einen Hash in einen anderen kombinieren möchten, können Sie das merge! Methode:

hash = { :a => 'a' }

# Returns the result of hash combined with a new hash, but does not alter
# the original hash.
hash.merge(:b => 'b')
# => {:a=>'a',:b=>'b'}

# Nothing has been altered in the original
hash
# => {:a=>'a'}

# Combine the two hashes and store the result in the original
hash.merge!(:b => 'b')
# => {:a=>'a',:b=>'b'}

# Hash has now been altered
hash
# => {:a=>'a',:b=>'b'}

Wie viele Methoden für String und Array kann auch ! gibt an, dass es sich um eine in-place -Operation handelt.

179
tadman
my_hash = {:a => 5}
my_hash[:key] = "value"
64
robbrit

Wenn Sie mehrere hinzufügen möchten:

hash = {:a => 1, :b => 2}
hash.merge! :c => 3, :d => 4
p hash
33
Josh Kovach
x = {:ca => "Canada", :us => "United States"}
x[:de] = "Germany"
p x
8
Jeremy Roman
hash = { a: 'a', b: 'b' }
 => {:a=>"a", :b=>"b"}
hash.merge({ c: 'c', d: 'd' })
 => {:a=>"a", :b=>"b", :c=>"c", :d=>"d"} 

Gibt den zusammengeführten Wert zurück.

hash
 => {:a=>"a", :b=>"b"} 

Ändert jedoch nicht das Aufruferobjekt

hash = hash.merge({ c: 'c', d: 'd' })
 => {:a=>"a", :b=>"b", :c=>"c", :d=>"d"} 
hash
 => {:a=>"a", :b=>"b", :c=>"c", :d=>"d"} 

Neuzuweisung macht den Trick.

1
Raam
hash {}
hash[:a] = 'a'
hash[:b] = 'b'
hash = {:a => 'a' , :b = > b}

Sie können Ihren Schlüssel und Wert von der Benutzereingabe erhalten, also können Sie Ruby . To_sym einen String in ein Symbol konvertieren und . To_i wandelt einen String in eine Ganzzahl um.
Beispielsweise:

movies ={}
movie = gets.chomp
rating = gets.chomp
movies[movie.to_sym] = rating.to_int
# movie will convert to a symbol as a key in our hash, and 
# rating will be an integer as a value.
0
ark1980