map và collect
Thuộc phần Kiến thức nền tảng trong hành trình Ruby của Coddy. Bài học 68 trên 88.
each rất phù hợp để thực hiện các thao tác trên phần tử, nhưng đôi khi bạn muốn biến đổi một mảng thành mảng mới. Phương thức map (còn gọi là collect) làm đúng việc này: tạo một mảng mới chứa kết quả chạy khối lệnh của bạn trên từng phần tử.
numbers = [1, 2, 3, 4]
doubled = numbers.map { |n| n * 2 }
puts doubled # Đầu ra: 2, 4, 6, 8Điểm khác biệt chính so với each là map trả về một mảng mới chứa các giá trị đã được biến đổi. Mảng ban đầu vẫn không thay đổi.
Đây là một ví dụ thực tế chuyển đổi nhiệt độ từ Celsius sang Fahrenheit:
celsius = [0, 20, 100]
fahrenheit = celsius.map { |c| c * 9 / 5 + 32 }
puts fahrenheit # Đầu ra: 32, 68, 212Bạn cũng có thể dùng map với các chuỗi:
names = ["alice", "bob"]
capitalized = names.map { |name| name.capitalize }
puts capitalized # In ra: Alice, BobCác phương thức map và collect giống hệt nhau. Ruby cung cấp cả hai tên, nên bạn có thể dùng tên nào phù hợp hơn với đoạn code của mình. Hầu hết nhà phát triển Ruby thích map hơn vì tên này ngắn hơn.
Thử thách
DễĐọc một dòng đầu vào gồm các số nguyên được phân tách bằng dấu phẩy (ví dụ: 2,4,6,8,10).
Tách đầu vào thành một mảng số nguyên, sau đó dùng phương thức map để tạo một mảng mới, trong đó mỗi số được bình phương (nhân với chính nó).
In từng phần tử của mảng mới đã bình phương trên một dòng riêng.
Ví dụ, nếu đầu vào là 2,4,6,8,10, đầu ra sẽ là:
4
16
36
64
100Nếu đầu vào là 1,2,3,4,5, đầu ra sẽ là:
1
4
9
16
25Nếu đầu vào là 3,7,11, đầu ra sẽ là:
9
49
121Nếu đầu vào là 10, đầu ra sẽ là:
100Tự làm thử
# Đọc đầu vào gồm các giá trị phân tách bằng dấu phẩy
input = gets.chomp
# TODO: Viết code của bạn bên dưới
# 1. Tách chuỗi đầu vào thành một mảng số nguyên
# 2. Dùng phương thức map để tính bình phương từng số
# 3. In mỗi số đã bình phương trên một dòng riêngBài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Kiến thức nền tảng
4Toán tử phần 2
Toán tử logic phần 1Toán tử logic phần 2Ôn tập: logic đơn giảnToán tử logic phần 3Toán tử logic phần 42Biến và kiểu dữ liệu
Số và biếnKiểu dữ liệu chuỗiKiểu dữ liệu BooleanKiểu dữ liệu SymbolKiểm tra kiểu dữ liệuQuy ước đặt tênÔn tập: tạo biến8Vòng lặp
Vòng lặp for với khoảng giá trịVòng lặp whileThoátTiếp tụcÔn tập: giai thừaVòng lặp timesVòng lặp untilVòng lặp lồng nhauÔn tập: đầu vào động3Toán tử phần 1
Toán tử số họcToán tử moduloPhép tính số học rút gọnÔn tập: Toán cơ bảnToán tử so sánh6Nhập xuất cơ bản
In ra bằng putsIn ra bằng print và pIn ra bằng biếnNhập dữ liệu bằng getsPhương thức chompChuyển đổi kiểu dữ liệuÔn tập: Tính tuổiÔn tập: Đúng hay sai9Phương thức
Định nghĩa phương thứcTham số phương thứcGiá trị trả vềÔn tập: phương thức SigmaÔn tập: phương thức xác thựcGiá trị tham số mặc định15Theo dõi chi tiêu hằng ngày
Tổng quan dự ánThoát chương trìnhTự luyện tập: Trình biên dịch Ruby online