7 methods của Ruby ít được biết đến nhưng rất hữu ích
This post hasn't been updated for 7 years
Ruby vốn được biết đến là một ngôn ngữ lập trình với cú pháp rất đơn giản và dễ hiểu. Điều này giúp code của các lập trình viên trở nên tốt hơn và "clear" hơn rất nhiều so với các ngôn ngữ lập trình khác.
Tuy nhiên liệu chúng ta đã khám phá hết được những thứ tuyệt vời mà Ruby mang lại? Trong bài viết này, tôi sẽ giới thiệu với các bạn 7 methods của Ruby mà có thể bạn chưa biết, ít gặp nhưng sẽ giúp code của các bạn gọn gàng, dễ hiểu và thân thiện hơn nhiều
Integer#digits (Ruby 2.4)
Đây là một method mới xuất hiện trong Ruby 2.4 và nó giúp bạn làm việc dễ dàng với các chữ số trong 1 số nguyên.
Chú ý: Kể từ Ruby 2.4, Fixnum và Bignum đã bị loại bỏ và được gộp lại thành Integer
Hãy cùng đến với ví dụ đơn giản sau: Lấy ra danh sách các chữ số của một số nguyên theo thứ tự ngược lại.
Theo cách thông thường, chúng ta sẽ làm như sau:
- Chuyển số nguyên ban đầu thành 1 xâu ký tự
- Dùng method
chars
để chuyển xâu vừa nhận được thành 1 mảng các ký tự - Dùng method
map
để chuyển mảng ký tự thành mảng các số nguyên - Đảo ngược mảng vừa nhận được bằng method
reverse
. Nghe có vẻ thật dài dòng phải không.
123.to_s.chars.map(&:to_i).reverse
[3, 2, 1]
Tuy nhiên với Integer#digits
thì mọi thứ đơn giản hơn rất nhiều.
123.digits
[3, 2, 1]
Kernel#tap
Bạn đã bao giờ gặp trường hợp mà muốn khởi tạo một object, gọi một vài method trên object đó và sau đó là trả lại chính object đó chưa? Theo cách thông thường, code của chúng ta sẽ như sau:
user = User.new
user.name = "John"
user
Dễ dàng nhận ra vấn đề ở đây là chúng ta phải tạo ra một biến tạm để thao tác trên đó. Nhưng với tab
thì đó không phải là điều chúng ta phải bận tâm nữa.
User.new.tap { |user| user.name = "John" }
Array#values_at
Method values_at
sẽ trả về các giá trị của mảng tại các vị trí được truyền vào qua tham số của method này.
Trực quan nhất thì chúng ta hãy đến với ví dụ sau: Lấy ra giá trị của các phần tử nằm ở vị trí 0, 1, 4 của một mảng.
arr = [1,2,3,4,5]
a, b, c = arr[0], arr[1], arr[4]
Với method values_at
, code của chúng ta nhìn sẽ "thân thiện" hơn:
a, b, c = arr.values_at(0, 1, 4)
Nó cũng sẽ hoạt động tốt với Hash
hash = {bacon: 300, chocolate: 200}
p hash.values_at(:bacon, :chocolate)
# [300, 200]
Method này sẽ rất hữu ích nếu số lượng các giá trị cần lấy tăng lên nhiều.
Hash#transform_values (Ruby 2.4)
Method này sẽ trả về một hash mới với các values được xử lý qua block
được truyền vào làm tham số và keys sẽ vẫn được giữ nguyên.
Ví dụ: Bạn muốn thay đổi tất các các values của một hash.
Cách đơn giản nhất mà chúng ta nghĩ đến ngay là dùng method each
, duyệt qua tất cả các cặp key-value và thực hiện các tính toán
h = {bacon: 200, coconut: 300}
h.each { |k,v| h[k] = v*2 }
Một cách khác là sử dụng Hash#transform_values
, code sẽ như sau:
h.transform_values! { |v| v * 2 }
Kernel#itself (Ruby 2.2)
Đúng như tên gọi của nó, method này sẽ trả về kết quả là chính nó. Nghe có vẻ hơi "thừa thãi" đúng không? Tuy nhiên thì trong một số trường hợp, bạn sẽ thấy nó rất hữu ích đấy, đặc biệt là với grouping. Ví dụ: Cho một mảng các từ có thể trùng lặp. Yêu cầu đặt ra là hãy đếm số lần xuất hiện của các từ trong mảng.\
Chúng ta có thể áp dụng ngay method transform_values
trên để giải quyết bài toán này:
words = %w(cat cat tiger dog cat)
words.group_by(&:itself).transform_values(&:size)
Kết quả chúng ta nhận được như sau:
#{"cat"=>3, "tiger"=>1, "dog"=>1}
Note: Method này được giới thiệu ở Object
class trong tài liệu về Ruby, nhưng trên thực tế thì nó được định nghĩa ở Kernel
module.
Array#count
Method này sẽ trả về số lượng các phần tử trong mảng tùy thuộc vào tham số truyền vào, cụ thể như sau:
- Không có tham số: Số lượng tất cả các phần tử
- Object: Số lượng các phần tử trong mảng bằng với object truyền vào, được so sánh bởi phép
==
- Block: Số lượng các phần tử mà khi thực thi block truyền vào, giá trị trả về là
true
Ví dụ:
ary = [1, 2, 4, 2]
ary.count
#=> 4
ary.count(2)
#=> 2
ary.count(&:even?)
#=> 3
Enumerable#cycle
Method này sẽ trả về một Enumerable
với số lần lặp lại tương đương với tham số truyền vào. Nếu không có tham số nào truyền vào thì số lần lặp sẽ là vô hạn. Nghe khá giống với phép *
một mảng đúng không.
Ví dụ:
array = %w(a b c)
# Same as array * 3
array.cycle(3).to_a
Tuy nhiên thì cách sử dụng mà tôi yêu thích nhất là tạo một "switch" hoặc "toggle" object.
switch = %w(on off).cycle
switch.next
Điểm tuyệt vời của cách sử dụng này là bạn không cần quan tâm đến trạng thái hiện tại để tìm ra trạng thái tiếp theo của đối tượng, rất thú vị phải không.
Summary
Như vậy trong bài viết này, tôi đã giới thiệu với các bạn 7 Ruby methods: Integer#digits
, Kernel#tap
, Array#values_at
, Hash#transform_values
, Kernel#itself
, Array#count
, Enumerable#cycle
.
Cảm ơn các bạn đã theo dõi và hi vọng các bạn sẽ thấy hữu ích cũng như có thể áp dụng chúng vào trong công việc.
Bài viết được dịch lại từ blog Rubyguides
All Rights Reserved