map, select, collect, inject, detect và each trong Ruby
Bài đăng này đã không được cập nhật trong 7 năm
Đối với Ruby, chúng ta sử dụng rất nhiều các methods của Array, như: map, each, select, collect, inject, detect
, sau đây chúng ra hãy xem chức năng cụ thể của chúng:
Map
map
lấy tất cả các đối tượng, sử dụng chúng chạy biểu thức trong block và trả về mảng mới là kết quả sau khi chạy hết tất cả các phần tử của mảng đối với biểu thức trong block:
[1,2,3,4,5,6,7,8,9,10].map{ |e| e * 5 }
# => [5, 10, 15, 20, 25, 30, 35, 40, 45, 50]
Nếu muốn lựa chọn ra các giá trị thỏa mãn 1 điều kiện nào đó với map
thì nó sẽ trả về một mảng các giá trị true
hoặc false
:
[1,2,3,4,5,6,7,8,9,10].map{ |e| e <= 3 }
# => [true, true, true, false, false, false, false, false, false, false]
Select
trả ra các giá trị thỏa mãn điều kiện trong block hoặc kết quả biểu thức trong block:
[1,2,3,4,5,6,7,8,9,10].select{ |e| e > 5 }
# => [6 ,7, 8, 9, 10]
[1,2,3,4,5,6,7,8,9,10].select{ |e| e * 3 }
# => [1,2,3,4,5,6,7,8,9,10]
Collect
Collect
khá giống với map
, nó trả về mảng mới bao gồm kết quả của việc thực hiện biểu thức trong block với lần lượt các phần tử trong mảng:
[1,2,3,4,5,6,7,8,9,10].collect{ |e| e * 5 }
# => [5, 10, 15, 20, 25, 30, 35, 40, 45, 50]
nếu muốn dùng nó để chọn các giá trị cho một điều kiện nào đó, nó cũng sẽ trả về true
hoặc false
:
[1,2,3,4,5,6,7,8,9,10].collect{ |e| e <= 3 }
# => [true, true, true, false, false, false, false, false, false, false]
Each
Each
sẽ thực thi biểu thức trong block với mỗi phần thử trong mảng và trả lại mảng ban đầu chứ không phải là mảng kết quả:
[1,2,3,4,5,6,7,8,9,10].each{ |e| print "#{e}!" e * 3 }
1!2!3!4!5!6!7!8!9!10! => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Nếu sử dụng each
để chạy đối với một biểu thức nhằm chọn ra những phần tử thỏa mãn một điều kiện nào đó, nó vẫn trả về mảng ban đầu:
[1,2,3,4,5,6,7,8,9,10].each{ |e| e <= 3 }
# => [1,2,3,4,5,6,7,8,9,10]
Inject
inject cũng cấp cho ta một biến số và cập nhập giá trị của biến số ấy sau mỗi phần tử của mảng được duyệt qua, điều này giúp ta thực hiện một số phép toán đơn giản hơn.Bên cạnh đó, inject còn có thể nhận giá trị đầu vào và nó cũng sẽ được thực thi biểu thức trong block như 1 phần tử trong mảng:
[1,2,3,4,5,6,7,8,9,10].inject{ |sum, e| sum += e }
# => 55
[1,2,3,4,5,6,7,8,9,10].inject(15){ |sum, e| sum += e }
# => 70
Detect
trả về phần tử đầu tiên trong mảng thỏa mãn với 1 điều kiện trong block:
[1,2,3,4,5,6,7,8,9,10].detect{ |e| e > 5 }
# => 6
đối với những biểu thức (không có điều kiện) thì nó sẽ trả về phần tử đầu tiên của mảng:
[1,2,3,4,5,6,7,8,9,10].detect{ |e| e * 3 }
# => 1
All rights reserved