Câu trả lời:
Các map
phương pháp có một đối tượng đếm được và một khối, và chạy các khối cho mỗi phần tử, xuất ra mỗi giá trị trả về từ khối (đối tượng ban đầu là không thay đổi trừ khi bạn sử dụng map!)
:
[1, 2, 3].map { |n| n * n } #=> [1, 4, 9]
Array
và Range
là vô số loại. map
với một khối trả về một mảng. map!
làm biến đổi mảng ban đầu.
Điều này hữu ích ở đâu, và sự khác biệt giữa map!
và là each
gì? Đây là một ví dụ:
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
Đầu ra:
Danil is a programmer
Edmund is a programmer
map
như thể nó làmap!
map
, cùng với select
và each
là một trong những con ngựa của Ruby trong mã của tôi.
Nó cho phép bạn chạy một hoạt động trên từng đối tượng của mảng và trả lại tất cả chúng ở cùng một nơi. Một ví dụ sẽ là tăng một mảng các số bằng một:
[1,2,3].map {|x| x + 1 }
#=> [2,3,4]
Nếu bạn có thể chạy một phương thức duy nhất trên các phần tử của mảng, bạn có thể thực hiện theo phương thức tốc ký như vậy:
Để làm điều này với ví dụ trên, bạn phải làm một cái gì đó như thế này
class Numeric
def plusone
self + 1
end
end
[1,2,3].map(&:plusone)
#=> [2,3,4]
Để đơn giản hơn là sử dụng kỹ thuật phím tắt và dấu, hãy sử dụng một ví dụ khác:
["vanessa", "david", "thomas"].map(&:upcase)
#=> ["VANESSA", "DAVID", "THOMAS"]
Chuyển đổi dữ liệu trong Ruby thường liên quan đến một loạt các map
hoạt động. Nghiên cứu map
& select
, chúng là một số phương thức Ruby hữu ích nhất trong thư viện chính. Chúng cũng quan trọng như each
.
( map
cũng là một bí danh cho collect
. Sử dụng bất cứ điều gì tốt nhất cho bạn về mặt khái niệm.)
Thêm thông tin hữu ích:
Nếu Đối tượng có thể đếm được bạn đang chạy each
hoặc map
bật có chứa một tập hợp các phần tử có thể đếm được (băm, mảng), bạn có thể khai báo từng phần tử đó trong các ống khối của mình như sau:
[["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
Trong trường hợp của Hash (cũng là một Enumerable
đối tượng, Hash chỉ đơn giản là một mảng các bộ dữ liệu với các hướng dẫn đặc biệt cho trình thông dịch). "Thông số đường ống" đầu tiên là khóa, thứ hai là giá trị.
{:make => "audi", :color => "black", :year => 2008}.each do |k,v|
puts "#{k} is #{v}"
end
#make is audi
#color is black
#year is 2008
Để trả lời câu hỏi thực tế:
Giả sử đó params
là một hàm băm, đây sẽ là cách tốt nhất để ánh xạ qua nó: Sử dụng hai tham số khối thay vì một để nắm bắt cặp khóa & giá trị cho mỗi bộ dữ liệu được giải thích trong hàm băm.
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
trong ruby 2 và 'số lượng đối số sai' trong ruby 1.9 / 1.8. Dù sao, tôi đã sử dụng lambda: plusone = ->(x) { x + 1 }
sau đó lấy ra công cụ xác định biểu tượng : [1,2,3].map(&plusone)
.
private
bên trong lớp nơi bạn đặt phương thức của mình trước khi bạn đặt phương thức của mình
0..param_count
có nghĩa là "lên đến và bao gồm param_count".
0...param_count
có nghĩa là "lên đến, nhưng không bao gồm param_count".
Range#map
không trả về một Enumerable
, nó thực sự ánh xạ nó đến một mảng. Nó giống như Range#to_a
.
Nó "ánh xạ" một chức năng cho từng mục trong một Enumerable
- trong trường hợp này là một phạm vi. Vì vậy, nó sẽ gọi khối được truyền một lần cho mỗi số nguyên từ 0 đến param_count
(độc quyền - bạn nói đúng về các dấu chấm) và trả về một mảng chứa mỗi giá trị trả về.
Đây là tài liệu cho Enumerable#map
. Nó cũng có một bí danh collect
,.
Range#map
thực sự chuyển đổi nó thành một mảng.
Enumerable
, giống như mỗi bản đồ. Tôi nghĩ rằng nó đã làm.
Bản đồ là một phần của mô-đun vô số. Rất giống với "thu thập" Ví dụ:
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}
Map cung cấp các giá trị lặp qua một mảng được trả về bởi các tham số khối.
#each
#each
chạy một hàm cho mỗi phần tử trong một mảng. Hai đoạn trích sau đây là tương đương:
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
áp dụng một hàm cho mỗi phần tử của một mảng, trả về mảng kết quả. Sau đây là tương đương:
array = ["zero", "one", "two"]
newArray = array.map{|element| element.capitalize()}
array = ["zero", "one", "two"]
newArray = []
array.each{|element|
newArray << element.capitalize()
}
#map!
#map!
là như thế #map
, nhưng sửa đổi các mảng tại chỗ. Sau đây là tương đương:
array = ["zero", "one", "two"]
array.map!{|element| element.capitalize()}
array = ["zero", "one", "two"]
array = array.map{|element| element.capitalize()}
map
là một phương thức "chức năng" phổ biến được tìm thấy trên Vô số đối tượng được sử dụng để chuyển đổi các giá trị theo trình tự (có cân nhắc đặc biệt)...
và...
là cách tạo ra phạm vi. Ngoài ra, hãy làm quen với REPL, nơi bạn có thể tự mình thử thứ này! :)