2011-07-28 40 views
82

En cuanto a agregar un key => value par a un hash poblado existente en Ruby, estoy en el proceso de trabajar con Apress 'Beginning Ruby y terminé el capítulo de hashes.Cómo agregar a un hash existente en Ruby

Estoy tratando de encontrar la forma más sencilla de lograr los mismos resultados con los hashes como esto con matrices:

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

Respuesta

166

Si tiene un hash, puede agregar elementos haciéndolo referenciar por clave:

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

Aquí, como [ ] crea una matriz vacía, { } creará un hash vacío.

Las matrices tienen cero o más elementos en un orden específico, donde los elementos pueden estar duplicados. Los valores hash tienen cero o más elementos organizados por la clave, donde las claves pueden no estar duplicadas pero los valores almacenados en esas posiciones pueden ser.

Hashes en Ruby son muy flexibles y pueden tener claves de casi cualquier tipo que se le pueda arrojar. Esto lo hace diferente de las estructuras de diccionario que encuentre en otros idiomas.

Es importante tener en cuenta que la naturaleza específica de una tecla de un hash menudo importa:

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 confunde esta manera que provee de HashWithIndifferentAccess donde va a convertir libremente entre los métodos de símbolos y de Cuerda de direccionamiento.

También puede indexar casi cualquier cosa, incluidas las clases, los números u otros valores hash.

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

hash[Object] 
# => true 

hash[Hash] 
# => false 

hash[Array] 
# => nil 

hashes se pueden convertir en las matrices y viceversa:

# 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"} 

Cuando se trata de "inserción" cosas en un hash que puede hacerlo de uno en uno, o utilizar el método merge para combinar valores hash:

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

Tenga en cuenta que esto no altera el hash original, sino que devuelve uno nuevo. Si desea combinar una almohadilla en otro, se puede utilizar el método de merge!:

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'} 

Al igual que muchos métodos en cadena y Array, el ! indica que se trata de una operaciónen el lugar.

+12

Una gran cantidad de información valiosa, pero carente de la formulación más básica, respondida simplemente por @robbrit. – danh

+1

Por favor, edite su respuesta para que realmente responda la pregunta que se le hizo, preferiblemente en algún lugar cerca de la parte superior. Sería grosero de mi parte hacerlo por ti. – Stephan

+0

@Stephan Se agregó un ejemplo más conciso en la parte superior. – tadman

62
my_hash = {:a => 5} 
my_hash[:key] = "value" 
8
x = {:ca => "Canada", :us => "United States"} 
x[:de] = "Germany" 
p x 
+0

he tratado de poner en práctica esto con las siguientes: 'x [ 'clave'] = "valor"' Sin embargo estoy recibiendo errores. Debo mencionar que estoy trabajando con cadenas. – Tom

+0

¿Cuál es el error? Podría ser cualquier cosa a menos que seas más específico. – tadman

32

Si desea agregar más de uno:

hash = {:a => 1, :b => 2} 
hash.merge! :c => 3, :d => 4 
p hash 
0
hash {} 
hash[:a] = 'a' 
hash[:b] = 'b' 
hash = {:a => 'a' , :b = > b} 

Usted puede obtener su clave y el valor de la entrada del usuario, lo que puede utilizar Rubí .to_sym puede convertir una cadena en un símbolo, y .to_i se convierte una cadena a un entero.
Por ejemplo:

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. 
Cuestiones relacionadas