Saya baru dalam pemrograman. Dapatkah seseorang menjelaskan apa yang .map
akan dilakukan di:
params = (0...param_count).map
Saya baru dalam pemrograman. Dapatkah seseorang menjelaskan apa yang .map
akan dilakukan di:
params = (0...param_count).map
Jawaban:
The map
Metode mengambil obyek enumerable dan blok, dan berjalan blok untuk setiap elemen, keluaran setiap nilai kembali dari blok (objek asli tidak berubah kecuali jika Anda menggunakan map!)
:
[1, 2, 3].map { |n| n * n } #=> [1, 4, 9]
Array
dan Range
merupakan tipe enumerable. map
dengan blok mengembalikan Array. map!
bermutasi array asli.
Di mana ini membantu, dan apa perbedaan antara map!
dan each
? Berikut ini sebuah contoh:
names = ['danil', 'edmund']
# here we map one array to another, convert each element by some rule
names.map! {|name| name.capitalize } # now names contains ['Danil', 'Edmund']
names.each { |name| puts name + ' is a programmer' } # here we just do something with each element
Hasil:
Danil is a programmer
Edmund is a programmer
map
seolah-olahmap!
map
, bersama dengan select
dan each
merupakan salah satu workhorses Ruby dalam kode saya.
Ini memungkinkan Anda untuk menjalankan operasi pada setiap objek array Anda dan mengembalikan semuanya di tempat yang sama. Contohnya adalah menambah array angka dengan satu:
[1,2,3].map {|x| x + 1 }
#=> [2,3,4]
Jika Anda dapat menjalankan metode tunggal pada elemen array Anda, Anda dapat melakukannya dengan gaya tulisan singkat seperti:
Untuk melakukan ini dengan contoh di atas Anda harus melakukan sesuatu seperti ini
class Numeric
def plusone
self + 1
end
end
[1,2,3].map(&:plusone)
#=> [2,3,4]
Untuk lebih mudah menggunakan teknik ampersand shortcut, mari kita gunakan contoh berbeda:
["vanessa", "david", "thomas"].map(&:upcase)
#=> ["VANESSA", "DAVID", "THOMAS"]
Mengubah data di Ruby seringkali melibatkan map
operasi kaskade . Pelajari map
& select
, mereka adalah beberapa metode Ruby paling berguna di perpustakaan utama. Mereka sama pentingnya dengan each
.
( map
juga merupakan alias untuk collect
. Gunakan apa pun yang terbaik untuk Anda secara konseptual.)
Informasi lebih bermanfaat:
Jika objek Enumerable yang Anda jalankan each
atau map
aktif berisi sekumpulan elemen Enumerable (hashes, array), Anda dapat mendeklarasikan masing-masing elemen di dalam pipa blok Anda seperti:
[["audi", "black", 2008], ["bmw", "red", 2014]].each do |make, color, year|
puts "make: #{make}, color: #{color}, year: #{year}"
end
# Output:
# make: audi, color: black, year: 2008
# make: bmw, color: red, year: 2014
Dalam kasus Hash (juga sebuah Enumerable
objek, Hash hanyalah sebuah array tupel dengan instruksi khusus untuk penerjemah). "Parameter pipa" pertama adalah kuncinya, yang kedua adalah nilainya.
{:make => "audi", :color => "black", :year => 2008}.each do |k,v|
puts "#{k} is #{v}"
end
#make is audi
#color is black
#year is 2008
Untuk menjawab pertanyaan aktual:
Dengan asumsi itu params
adalah hash, ini akan menjadi cara terbaik untuk memetakannya: Gunakan dua parameter blok alih-alih satu untuk menangkap pasangan kunci & nilai untuk setiap tuple yang ditafsirkan dalam hash.
params = {"one" => 1, "two" => 2, "three" => 3}
params.each do |k,v|
puts "#{k}=#{v}"
end
# one=1
# two=2
# three=3
NoMethodError: private method 'plusone' called for 1:Fixnum
ruby 2 dan 'salah jumlah args' di ruby 1.9 / 1.8. Pokoknya, saya menggunakan lambda: plusone = ->(x) { x + 1 }
kemudian mengambil keluar specifier simbol: [1,2,3].map(&plusone)
.
private
di dalam kelas di mana Anda meletakkan metode Anda sebelum Anda meletakkan metode Anda
0..param_count
berarti "hingga dan termasuk param_count".
0...param_count
berarti "hingga, tetapi tidak termasuk param_count".
Range#map
tidak mengembalikan Enumerable
, sebenarnya memetakannya ke array. Itu sama dengan Range#to_a
.
Ini "memetakan" fungsi untuk setiap item dalam Enumerable
- dalam hal ini, rentang. Jadi itu akan memanggil blok yang dilewati satu kali untuk setiap bilangan bulat dari 0 hingga param_count
(eksklusif - Anda benar tentang titik-titik) dan mengembalikan array yang berisi setiap nilai kembali.
Inilah dokumentasi untuk Enumerable#map
. Itu juga memiliki alias collect
,.
Range#map
sebenarnya mengubahnya menjadi sebuah array.
Enumerable
, seperti masing-masing. Saya pikir itu terjadi.
Peta adalah bagian dari modul enumerable. Sangat mirip dengan "kumpulkan" Misalnya:
Class Car
attr_accessor :name, :model, :year
Def initialize (make, model, year)
@make, @model, @year = make, model, year
end
end
list = []
list << Car.new("Honda", "Accord", 2016)
list << Car.new("Toyota", "Camry", 2015)
list << Car.new("Nissan", "Altima", 2014)
p list.map {|p| p.model}
Peta menyediakan nilai yang berulang melalui array yang dikembalikan oleh parameter blok.
#each
#each
menjalankan fungsi untuk setiap elemen dalam array. Dua kutipan kode berikut ini setara:
x = 10
["zero", "one", "two"].each{|element|
x++
puts element
}
x = 10
array = ["zero", "one", "two"]
for i in 0..2
x++
puts array[i]
end
#map
#map
menerapkan fungsi ke setiap elemen array, mengembalikan array yang dihasilkan. Berikut ini adalah setara:
array = ["zero", "one", "two"]
newArray = array.map{|element| element.capitalize()}
array = ["zero", "one", "two"]
newArray = []
array.each{|element|
newArray << element.capitalize()
}
#map!
#map!
seperti #map
, tetapi memodifikasi array di tempatnya. Berikut ini adalah setara:
array = ["zero", "one", "two"]
array.map!{|element| element.capitalize()}
array = ["zero", "one", "two"]
array = array.map{|element| element.capitalize()}
map
adalah metode "fungsional" umum yang ditemukan pada objek Enumerable yang digunakan untuk mengubah nilai-nilai dalam urutan (dengan pertimbangan khusus)...
dan...
cara membuat rentang. Juga, biasakan diri dengan REPL, di mana Anda dapat mencoba sendiri hal-hal ini! :)