J'ai un tableau et une fonction qui renvoie une valeur à partir d'une valeur. En fin de compte, je souhaite créer une table de hachage ayant les valeurs du tableau comme valeur de clé et le résultat de f (valeur_clé) comme valeur. Existe-t-il un moyen simple et propre, semblable à chaque carte d’Array, de le faire en utilisant un bloc?
Donc, quelque chose qui équivaut à
hsh = {}
[1,2,3,4].each do |x|
hsh[x] = f(x)
end
mais ressemble plus à cela, en ce sens que c'est simple et une ligne?
results = array.map { | x | f(x) }
Vous pouvez également définir la fonction comme valeur par défaut du hash:
hash = Hash.new {|hash, key| hash[key] = f(key) }
Ensuite, lorsque vous recherchez une valeur, le hachage la calcule et la stocke à la volée.
hash[10]
hash.inspect #=> { 10 => whatever_the_result_is }
Notez que depuis Ruby 2.1.0, vous pouvez aussi utiliser Array # to_h , comme ceci:
[1,2,3,4].map{ |x| [x, f(x)] }.to_h
Découvrez la méthode Hash :: [] .
Hash[ [1,2,3,4].collect { |x| [x, f(x)] } ]
Vous avez besoin de each_with_object
.
def f x
x * 2
end
t = [1, 2, 3, 4].each_with_object({}) do |x, memo|
memo[x] = f(x)
end
t # => {1=>2, 2=>4, 3=>6, 4=>8}
Un autre:
t2 = [1, 2, 3, 4].map{|x| [x, f(x)]}
Hash[t2] # => {1=>2, 2=>4, 3=>6, 4=>8}
Utilisation de Facets ' mash (méthode pour convertir enumerable en hashes):
[1, 2, 3, 4].mash { |x| [x, f(x)] }
De Ruby 2.1:
[1, 2, 3, 4].map { |x| [x, f(x)] }.to_h
Ruby 2.6.0 permet de passer un bloc à la méthode to_h
- . Cela permet une syntaxe encore plus courte pour créer un hachage à partir d'un tableau:
[1, 2, 3, 4].to_h { |x| [x, f(x)] }
Vous recherchez reduce()|inject()
, méthode :
elem = [1,2,3,4]
h = elem.reduce({}) do |res, x|
res[x] = x**2
res
end
puts h
L'argument transmis à reduce({})
est la valeur initiale d'un objet intermédiaire transmis au bloc en tant que variable res
. À chaque itération, nous ajoutons une nouvelle paire key: value
au hachage res
et retenons le hachage pour qu'il soit utilisé lors de la prochaine itération.
La méthode ci-dessus calcule un hachage très pratique de valeurs carrées:
{1=>1, 2=>4, 3=>9, 4=>16}