map, select, collect, inject, detect và each trong Ruby

Đố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