Saya memiliki sebuah array, dan fungsi yang mengembalikan nilai yang diberikan nilai. Pada akhirnya saya ingin membuat hashmap yang memiliki nilai-nilai dari array sebagai nilai kunci, dan hasil dari f(key_value) sebagai nilai. Ada yang bersih, dengan cara yang sederhana, seperti yang serupa untuk masing-masing/peta dari Hotel, lakukan ini menggunakan blok?
Jadi sesuatu yang setara dengan
hsh = {}
[1,2,3,4].each do |x|
hsh[x] = f(x)
end
tetapi terlihat lebih mirip dengan ini, dalam hal ini's sederhana dan satu baris?
results = array.map { | x | f(x) }
Perhatikan bahwa sejak Ruby 2.1.0 anda juga dapat menggunakan Array#to_h, seperti ini:
[1,2,3,4].map{ |x| [x, f(x)] }.to_h
Anda juga bisa mendefinisikan fungsi hash's nilai default:
hash = Hash.new {|hash, key| hash[key] = f(key) }
Kemudian ketika anda mencari sebuah nilai, hash akan menghitung dan menyimpan pada terbang.
hash[10]
hash.inspect #=> { 10 => whatever_the_result_is }
Anda perlu 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}
Satu lagi:
t2 = [1, 2, 3, 4].map{|x| [x, f(x)]}
Hash[t2] # => {1=>2, 2=>4, 3=>6, 4=>8}
Anda'kembali mencari mengurangi()|inject()
metode:
elem = [1,2,3,4]
h = elem.reduce({}) do |res, x|
res[x] = x**2
res
end
puts h
Argumen yang dilewatkan ke mengurangi({})
adalah nilai awal dari perantara objek yang diteruskan ke blok sebagai res
variabel. Dalam setiap iterasi kami're menambahkan pasangan baru kunci: nilai
ke res
Hash dan returing Hash yang akan digunakan dalam iterasi berikutnya.
Metode di atas precomputes yang sangat praktis hash dari kuadrat nilai-nilai:
{1=>1, 2=>4, 3=>9, 4=>16}