Ở bài viết lần trước (Ruby căn bản – String) , chúng ta đã biết rằng strings có thể được coi là một chuỗi các ký tự theo thứ tự nào đó. Trong bài này, chúng ta cùng nhau tìm hiểu về kiểu dữ liệu mảng (Array), đó là một Ruby container chứa một list các phần tử tùy ý theo một thứ tự nào đó. Chúng ta sẽ bắt đầu bằng cách liên kết giữa string và array thông qua method String#split, sau đó cùng tìm hiểu về rất nhiều các array methods trong bài viết này.
Splitting
Cho đến hiện tại chúng ta đã tìm hiểu khá nhiều về string, có một cách đơn giản để chuyển string sang array đó là sử dụng method split.
1 2 3 | <span class="token operator">></span><span class="token operator">></span> <span class="token string">"ant bat cat"</span><span class="token punctuation">.</span>split<span class="token punctuation">(</span><span class="token string">" "</span><span class="token punctuation">)</span> <span class="token comment"># Split a string into a three-element array.</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span><span class="token string">"ant"</span><span class="token punctuation">,</span> <span class="token string">"bat"</span><span class="token punctuation">,</span> <span class="token string">"cat"</span><span class="token punctuation">]</span> |
Từ kết quả trả về như trên, ta thấy rằng split trả về một list string mà đã được phân tách với nhau bằng khoảng trắng trong string gốc.
Chúng ta thường phân tách dựa trên khoảng trắng (space), tuy nhiên chúng ta cũng có thể phân tách dựa trên bất kỳ thứ gì khác.
1 2 3 4 5 6 7 | <span class="token operator">></span><span class="token operator">></span> <span class="token string">"ant,bat,cat"</span><span class="token punctuation">.</span>split<span class="token punctuation">(</span><span class="token string">","</span><span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span><span class="token string">"ant"</span><span class="token punctuation">,</span> <span class="token string">"bat"</span><span class="token punctuation">,</span> <span class="token string">"cat"</span><span class="token punctuation">]</span> <span class="token operator">></span><span class="token operator">></span> <span class="token string">"ant, bat, cat"</span><span class="token punctuation">.</span>split<span class="token punctuation">(</span><span class="token string">", "</span><span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span><span class="token string">"ant"</span><span class="token punctuation">,</span> <span class="token string">"bat"</span><span class="token punctuation">,</span> <span class="token string">"cat"</span><span class="token punctuation">]</span> <span class="token operator">></span><span class="token operator">></span> <span class="token string">"antheybatheycathey"</span><span class="token punctuation">.</span>split<span class="token punctuation">(</span><span class="token string">"hey"</span><span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span><span class="token string">"ant"</span><span class="token punctuation">,</span> <span class="token string">"bat"</span><span class="token punctuation">,</span> <span class="token string">"cat"</span><span class="token punctuation">]</span> |
Thậm chí, ta có thể phân chia (split) string thành các ký tự bằng cách phân chia dựa trêm empty string.
1 2 3 | <span class="token operator">></span><span class="token operator">></span> <span class="token string">"badger"</span><span class="token punctuation">.</span>split<span class="token punctuation">(</span><span class="token string">""</span><span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span><span class="token string">'b'</span><span class="token punctuation">,</span> <span class="token string">'a'</span><span class="token punctuation">,</span> <span class="token string">'d'</span><span class="token punctuation">,</span> <span class="token string">'g'</span><span class="token punctuation">,</span> <span class="token string">'e'</span><span class="token punctuation">,</span> <span class="token string">'r'</span><span class="token punctuation">]</span> |
Thực tế, có lẽ split phổ biến nhất đó là không dùng đối số (arguments), trong trường hợp này, sẽ split mặc định theo khoảng trắng, tabs, hoặc newlines.
1 2 3 4 5 | <span class="token operator">></span><span class="token operator">></span> <span class="token string">"ant bat cat"</span><span class="token punctuation">.</span>split <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span><span class="token string">"ant"</span><span class="token punctuation">,</span> <span class="token string">"bat"</span><span class="token punctuation">,</span> <span class="token string">"cat"</span><span class="token punctuation">]</span> <span class="token operator">></span><span class="token operator">></span> <span class="token string">"ant batttcatn duck"</span><span class="token punctuation">.</span>split <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span><span class="token string">"ant"</span><span class="token punctuation">,</span> <span class="token string">"bat"</span><span class="token punctuation">,</span> <span class="token string">"cat"</span><span class="token punctuation">,</span> <span class="token string">"duck"</span><span class="token punctuation">]</span> |
Array access
Hiện tại, chúng ta đã có được một mảng các ký tự bằng cách dùng split method. Tiếp theo, chúng ta thử gán mảng đó vào một biến.
1 2 3 | <span class="token operator">></span><span class="token operator">></span> a <span class="token operator">=</span> <span class="token string">"badger"</span><span class="token punctuation">.</span>split<span class="token punctuation">(</span><span class="token string">""</span><span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span><span class="token string">"b"</span><span class="token punctuation">,</span> <span class="token string">"a"</span><span class="token punctuation">,</span> <span class="token string">"d"</span><span class="token punctuation">,</span> <span class="token string">"g"</span><span class="token punctuation">,</span> <span class="token string">"e"</span><span class="token punctuation">,</span> <span class="token string">"r"</span><span class="token punctuation">]</span> |
Sau đó, thì chúng ta có thể truy cập tới một element cụ thể trong mảng bằng cách sử dụng dấu ngoặc vuông.
1 2 3 4 5 6 7 | <span class="token punctuation">></span><span class="token punctuation">></span> a<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> =<span class="token punctuation">></span> "b" <span class="token punctuation">></span><span class="token punctuation">></span> a<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> =<span class="token punctuation">></span> "a" <span class="token punctuation">></span><span class="token punctuation">></span> a<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> =<span class="token punctuation">></span> "d" |
Tương tự như với string, array cũng là zero-offset, nghĩa là phần tử đầu tiên sẽ có index là 0, phần tử thứ hai là 1, …
Hiện tại chúng ta mới biết là array thì chưa một mảng các ký tự, tuy nhiên là Array trong Ruby có thể chứa bất kỳ thể loại phần tử nào.
1 2 3 4 5 6 7 8 | <span class="token operator">></span><span class="token operator">></span> soliloquy <span class="token operator">=</span> <span class="token string">"To be, or not to be, that is the question:"</span> <span class="token operator">></span><span class="token operator">></span> a <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">"badger"</span><span class="token punctuation">,</span> <span class="token number">42</span><span class="token punctuation">,</span> soliloquy<span class="token punctuation">.</span><span class="token keyword">include</span><span class="token operator">?</span><span class="token punctuation">(</span><span class="token string">"To be"</span><span class="token punctuation">)</span><span class="token punctuation">]</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span><span class="token string">"badger"</span><span class="token punctuation">,</span> <span class="token number">42</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">]</span> <span class="token operator">></span><span class="token operator">></span> a<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token boolean">true</span> <span class="token operator">></span><span class="token operator">></span> a<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token keyword">nil</span> |
ta thấy, bằng cách dùng dấu ngoặc vuông [], ta có thể truy cập tới bất kỳ thể loại phần tử nào trong mảng. Chúng ta cũng đã cố truy cập vào index nằm ngoài phạm vị, kết quả là đã return về nil. Điều này có thể gây ngạc nhiên cho những bạn đã có kinh nghiệm lập trình trước đó, vì ở nhiều ngôn ngữ khác hệ thống sẽ báo lỗi nếu ta cố truy cập vào phần tử nằm ngoài phạm vi, nhưng Ruby thì lại khá mềm dẻo trong vấn đề này.
Một tính năng tiện lợi khác của Ruby đó là cho phép chỉ mục âm, được tính từ cuối mảng.
1 2 3 | <span class="token operator">></span><span class="token operator">></span> a<span class="token punctuation">[</span><span class="token operator">-</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token number">42</span> |
Qua đó, chúng ta có một số cách tiện lợi để lấy phần tử cuối cùng:
1 2 3 | <span class="token operator">></span><span class="token operator">></span> a<span class="token punctuation">[</span>a<span class="token punctuation">.</span>length <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token boolean">true</span> |
1 2 3 | <span class="token operator">></span><span class="token operator">></span> a<span class="token punctuation">[</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token boolean">true</span> |
Và Ruby cũng cung cấp một hàm đặc biệt để làm điều này đó là dùng last method
1 2 3 | <span class="token operator">></span><span class="token operator">></span> a<span class="token punctuation">.</span>last <span class="token operator">=</span><span class="token operator">></span> <span class="token boolean">true</span> |
Array slicing
Ngoài việc dùng dấu ngoặc vuông để truy cập các phần tử như ở bên trên, Ruby còn cung cấp một kỹ thuật là array slicing để truy cập cùng lúc nhiều phần tử. Chúng ta có mảng a như sau:
1 2 3 | <span class="token operator">></span><span class="token operator">></span> a <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">42</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">17</span><span class="token punctuation">,</span> <span class="token number">99</span><span class="token punctuation">]</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span><span class="token number">42</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">17</span><span class="token punctuation">,</span> <span class="token number">99</span><span class="token punctuation">]</span> |
Để cắt một mảng, ta cần truyền vào 2 đối số. Một là index. Hai là số lượng phần từ cần trả về bắt đầu từ index đã truyền vào. Ví dụ, mảng a có 4 phần tử, thì slice(2, 2) sẽ trả về phần tứ thứ 2 và thư 3 (chú ý, là index bắt đầu của mảng là từ 0)
1 2 3 | <span class="token operator">></span><span class="token operator">></span> a<span class="token punctuation">.</span>slice<span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span><span class="token number">17</span><span class="token punctuation">,</span> <span class="token number">99</span><span class="token punctuation">]</span> |
Một cách khác để làm điều đó là sử dụng kiểu dữ liệu Range, nó sẽ trả về các phần từ giữa index đầu và index cuối đã truyền vào.
1 2 3 | <span class="token operator">></span><span class="token operator">></span> a<span class="token punctuation">.</span>slice<span class="token punctuation">(</span><span class="token number">1.</span><span class="token number">.3</span><span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span><span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">17</span><span class="token punctuation">,</span> <span class="token number">99</span><span class="token punctuation">]</span> |
Cũng tương tự như các ngôn ngữ khác, Ruby cho phép chúng ta cắt mảng trực tiếp bằng cách sử dụng dấu ngoặc vuông.
1 2 3 4 5 | <span class="token operator">></span><span class="token operator">></span> a<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span><span class="token number">17</span><span class="token punctuation">,</span> <span class="token number">99</span><span class="token punctuation">]</span> <span class="token operator">></span><span class="token operator">></span> a<span class="token punctuation">[</span><span class="token number">1.</span><span class="token number">.3</span><span class="token punctuation">]</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span><span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">17</span><span class="token punctuation">,</span> <span class="token number">99</span><span class="token punctuation">]</span> |
Cuối cùng, chúng ta có thể dễ dàng chuyển đối một Range (phạm vi), thành một mảng, bằng cách sử dụng hàm to_a (to array).
1 2 3 4 5 6 | <span class="token operator">></span><span class="token operator">></span> <span class="token punctuation">(</span><span class="token number">1.</span><span class="token number">.10</span><span class="token punctuation">)</span><span class="token punctuation">.</span>to_a <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">6</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">9</span><span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">]</span> <span class="token operator">></span><span class="token operator">></span> <span class="token punctuation">(</span><span class="token string">'a'</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token string">'z'</span><span class="token punctuation">)</span><span class="token punctuation">.</span>to_a <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span><span class="token string">"a"</span><span class="token punctuation">,</span> <span class="token string">"b"</span><span class="token punctuation">,</span> <span class="token string">"c"</span><span class="token punctuation">,</span> <span class="token string">"d"</span><span class="token punctuation">,</span> <span class="token string">"e"</span><span class="token punctuation">,</span> <span class="token string">"f"</span><span class="token punctuation">,</span> <span class="token string">"g"</span><span class="token punctuation">,</span> <span class="token string">"h"</span><span class="token punctuation">,</span> <span class="token string">"i"</span><span class="token punctuation">,</span> <span class="token string">"j"</span><span class="token punctuation">,</span> <span class="token string">"k"</span><span class="token punctuation">,</span> <span class="token string">"l"</span><span class="token punctuation">,</span> <span class="token string">"m"</span><span class="token punctuation">,</span> <span class="token string">"n"</span><span class="token punctuation">,</span> <span class="token string">"o"</span><span class="token punctuation">,</span> <span class="token string">"p"</span><span class="token punctuation">,</span> <span class="token string">"q"</span><span class="token punctuation">,</span> <span class="token string">"r"</span><span class="token punctuation">,</span> <span class="token string">"s"</span><span class="token punctuation">,</span> <span class="token string">"t"</span><span class="token punctuation">,</span> <span class="token string">"u"</span><span class="token punctuation">,</span> <span class="token string">"v"</span><span class="token punctuation">,</span> <span class="token string">"w"</span><span class="token punctuation">,</span> <span class="token string">"x"</span><span class="token punctuation">,</span> <span class="token string">"y"</span><span class="token punctuation">,</span> <span class="token string">"z"</span><span class="token punctuation">]</span> |
More array methods
Ngoài hàm last, length, hay slice, thì Ruby còn hỗ trợ vô số các method khác. Bạn có thể tham khảo thêm ở documentation của Ruby.
Tương tự như string, array cũng hỗ trợ method include? để kiểm tra phần tử trong array.
1 2 3 4 5 6 7 | <span class="token operator">></span><span class="token operator">></span> a <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">42</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">17</span><span class="token punctuation">,</span> <span class="token number">99</span><span class="token punctuation">]</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span><span class="token number">42</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">17</span><span class="token punctuation">,</span> <span class="token number">99</span><span class="token punctuation">]</span> <span class="token operator">></span><span class="token operator">></span> a<span class="token punctuation">.</span><span class="token keyword">include</span><span class="token operator">?</span><span class="token punctuation">(</span><span class="token number">42</span><span class="token punctuation">)</span> <span class="token comment"># Test for element inclusion.</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token boolean">true</span> <span class="token operator">></span><span class="token operator">></span> a<span class="token punctuation">.</span><span class="token keyword">include</span><span class="token operator">?</span><span class="token punctuation">(</span><span class="token string">"foo"</span><span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token boolean">false</span> |
Sorting and reversing
Trong ruby, chúng ta có thể thực hiện sort một cách đơn giản bằng cách gọi hàm sort.
1 2 3 4 5 | <span class="token operator">></span><span class="token operator">></span> a<span class="token punctuation">.</span>sort <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span><span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">17</span><span class="token punctuation">,</span> <span class="token number">42</span><span class="token punctuation">,</span> <span class="token number">99</span><span class="token punctuation">]</span> <span class="token operator">></span><span class="token operator">></span> a <span class="token comment"># `a` hasn't changed as the result of `sort`.</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span><span class="token number">42</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">17</span><span class="token punctuation">,</span> <span class="token number">99</span><span class="token punctuation">]</span> |
Chúng ta thấy rằng, hàm sort đã sắp xếp mảng trên mà không làm thay đổi giá trị của bản thân mảng đó.
Để thay đổi hẳn giá trị của mảng, Ruby hỗ trợ câu lệnh dưới đây:
1 2 3 4 5 | <span class="token operator">></span><span class="token operator">></span> a<span class="token punctuation">.</span>sort<span class="token operator">!</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span><span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">17</span><span class="token punctuation">,</span> <span class="token number">42</span><span class="token punctuation">,</span> <span class="token number">99</span><span class="token punctuation">]</span> <span class="token operator">></span><span class="token operator">></span> a <span class="token comment"># `a` has changed as the result of `sort!`.</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span><span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">17</span><span class="token punctuation">,</span> <span class="token number">42</span><span class="token punctuation">,</span> <span class="token number">99</span><span class="token punctuation">]</span> |
Như ta thấy hàm sort! (đọc là “sort-bang”), đã thêm ký tự ! (bang) sau tên hàm, để thay đổi giá trị của object. Bất kỳ khi nào bạn nhìn thấy kí hiệu đó, thì khả năng lớn là hàm đó sẽ thay đổi hẳn giá trị của object.
Có một phương thức hữu ích khác, mà chúng ta cũng thường xuyên sử dụng đó là reverse method.
1 2 3 4 5 | <span class="token operator">></span><span class="token operator">></span> a<span class="token punctuation">.</span>reverse <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span><span class="token number">99</span><span class="token punctuation">,</span> <span class="token number">42</span><span class="token punctuation">,</span> <span class="token number">17</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">]</span> <span class="token operator">></span><span class="token operator">></span> a <span class="token comment"># Like `sort`, `reverse` doesn't mutate the array.</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span><span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">17</span><span class="token punctuation">,</span> <span class="token number">42</span><span class="token punctuation">,</span> <span class="token number">99</span><span class="token punctuation">]</span> |
Cũng tương tự như hàm sort, hàm reverse sẽ trả về một mảng mới, mà không thay đổi giá trị của bản thân mảng đó.
Pushing and popping
Có một cặp method rất hữu ích mà chúng ta cũng thường xuyên sử dụng đó là push và pop. push cho phép ta nối một phần tử vào cuối mảng, trong khi pop sẽ xóa nó.
1 2 3 4 5 6 7 8 9 10 11 12 13 | <span class="token operator">></span><span class="token operator">></span> a<span class="token punctuation">.</span>push<span class="token punctuation">(</span><span class="token number">6</span><span class="token punctuation">)</span> <span class="token comment"># Pushing onto an array</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span><span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">17</span><span class="token punctuation">,</span> <span class="token number">42</span><span class="token punctuation">,</span> <span class="token number">99</span><span class="token punctuation">,</span> <span class="token number">6</span><span class="token punctuation">]</span> <span class="token operator">></span><span class="token operator">></span> a<span class="token punctuation">.</span>push<span class="token punctuation">(</span><span class="token string">"foo"</span><span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span><span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">17</span><span class="token punctuation">,</span> <span class="token number">42</span><span class="token punctuation">,</span> <span class="token number">99</span><span class="token punctuation">,</span> <span class="token number">6</span><span class="token punctuation">,</span> <span class="token string">"foo"</span><span class="token punctuation">]</span> <span class="token operator">></span><span class="token operator">></span> a<span class="token punctuation">.</span>pop <span class="token comment"># `pop` returns the value itself</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">"foo"</span> <span class="token operator">></span><span class="token operator">></span> a<span class="token punctuation">.</span>pop <span class="token operator">=</span><span class="token operator">></span> <span class="token number">6</span> <span class="token operator">></span><span class="token operator">></span> a<span class="token punctuation">.</span>pop <span class="token operator">=</span><span class="token operator">></span> <span class="token number">99</span> <span class="token operator">></span><span class="token operator">></span> a <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span><span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">17</span><span class="token punctuation">,</span> <span class="token number">42</span><span class="token punctuation">]</span> |
Như comment ở trên, pop trả về phần tử cuối cùng (và cũng xóa nó khỏi mảng), còn push thì chỉ return về mảng kết quả.
1 2 3 | <span class="token operator">></span><span class="token operator">></span> the_answer_to_life_the_universe_and_everything <span class="token operator">=</span> a<span class="token punctuation">.</span>pop <span class="token operator">=</span><span class="token operator">></span> <span class="token number">42</span> |
Cuối cùng, Ruby có hỗ trợ một ký hiệu để thêm phần tử vào mảng đó là “<<” (gọi là “shovel operator”).
1 2 3 4 5 | <span class="token operator">></span><span class="token operator">></span> a <span class="token operator"><</span><span class="token operator"><</span> <span class="token string">"badger"</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span><span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">17</span><span class="token punctuation">,</span> <span class="token string">"badger"</span><span class="token punctuation">]</span> <span class="token operator">></span><span class="token operator">></span> a <span class="token operator"><</span><span class="token operator"><</span> <span class="token string">"ant"</span> <span class="token operator"><</span><span class="token operator"><</span> <span class="token string">"bat"</span> <span class="token operator"><</span><span class="token operator"><</span> <span class="token string">"cat"</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span><span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">17</span><span class="token punctuation">,</span> <span class="token string">"badger"</span><span class="token punctuation">,</span> <span class="token string">"ant"</span><span class="token punctuation">,</span> <span class="token string">"bat"</span><span class="token punctuation">,</span> <span class="token string">"cat"</span><span class="token punctuation">]</span> |
Undoing a split
Một ví dụ tiếp theo về Array method đó là hàm join. Trong khi hàm split tách string thành các phần tử của một mảng, thì join lại kết nối chúng với nhau thành một string.
1 2 3 4 5 6 7 8 9 | <span class="token operator">></span><span class="token operator">></span> a <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">"ant"</span><span class="token punctuation">,</span> <span class="token string">"bat"</span><span class="token punctuation">,</span> <span class="token string">"cat"</span><span class="token punctuation">,</span> <span class="token number">42</span><span class="token punctuation">]</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span><span class="token string">"ant"</span><span class="token punctuation">,</span> <span class="token string">"bat"</span><span class="token punctuation">,</span> <span class="token string">"cat"</span><span class="token punctuation">,</span> <span class="token number">42</span><span class="token punctuation">]</span> <span class="token operator">></span><span class="token operator">></span> a<span class="token punctuation">.</span>join <span class="token comment"># Join on default (empty space).</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">"antbatcat42"</span> <span class="token operator">></span><span class="token operator">></span> a<span class="token punctuation">.</span>join<span class="token punctuation">(</span><span class="token string">", "</span><span class="token punctuation">)</span> <span class="token comment"># Join on comma-space.</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">"ant, bat, cat, 42"</span> <span class="token operator">></span><span class="token operator">></span> a<span class="token punctuation">.</span>join<span class="token punctuation">(</span><span class="token string">" -- "</span><span class="token punctuation">)</span> <span class="token comment"># Join on double dashes.</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">"ant -- bat -- cat -- 42"</span> |
Chú ý rằng, phần tử cuối – số 42 sẽ tự động được convert thành string, trong phép join.
Array iteration
Một trong những công việc phổ biến với mảng, là lặp qua từng phần tử trong mảng và thao tác với chúng.
1 2 3 4 5 6 7 8 | <span class="token operator">></span><span class="token operator">></span> <span class="token keyword">for</span> i <span class="token keyword">in</span> <span class="token number">0.</span><span class="token punctuation">.</span>a<span class="token punctuation">.</span>length <span class="token keyword">do</span> <span class="token operator">?</span><span class="token operator">></span> puts a<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">></span><span class="token operator">></span> <span class="token keyword">end</span> ant bat cat <span class="token number">42</span> |
Dùng hàm for có vẻ cũng khá tiện lợi, tuy nhiên đó không phải là cách tốt nhất để lặp qua các phần tử trong mảng.
Chúng ta sẽ dùng một phương thức nổi trội của Ruby đó là hàm each.
1 2 3 4 5 6 7 8 | <span class="token operator">></span><span class="token operator">></span> a<span class="token punctuation">.</span><span class="token keyword">each</span> <span class="token keyword">do</span> <span class="token operator">|</span>element<span class="token operator">|</span> <span class="token operator">?</span><span class="token operator">></span> puts element <span class="token operator">></span><span class="token operator">></span> <span class="token keyword">end</span> ant bat cat <span class="token number">42</span> |
Với hàm each, chúng ta có thể nhanh chóng lặp qua từng phần tử trong mảng và thao tác với chúng (như ở ví dụ trên là ta in ra màn hình từng phần tử một) mà không phải viết dài dòng như hàm for: “for (i = 0; i < N; i++)”. Qua đó, code của chúng ta sẽ trở nên rõ ràng hơn và dễ đọc hơn.
Hết. Chúng ta sẽ cùng nhau tìm hiểu các chủ đề khác trong Ruby ở các bài viết lần tới nhé.
Nguồn: Learn-enough