Bạn có biết dùng đúng phương thức Ruby tiết kiệm nhiều công việc?
Càng quen nhiều phương thức càng nhanh tạo ra mã hoạt động & mã tốt hơn, cả hiệu suất & chất lượng.
Vì vậy hôm nay giới thiệu 7 phương thức thú vị bạn có thể chưa thấy.
Mục lục
- 1 Phương thức Integer#digits (Ruby 2.4)
- 2 Phương thức Tap
- 3 Array#values_at
- 4 Hash#transform_values (Ruby 2.4)
- 5 Kernel#itself (Ruby 2.2)
- 6 Array#count
- 7 Enumerable#cycle
- 8 Tóm tắt
Phương thức Integer#digits (Ruby 2.4)
Phương thức mới Ruby 2.4 rất hữu ích nếu muốn làm việc với từng chữ số của Integer.
Lưu ý: Nếu chưa cập nhật Ruby 2.4, Fixnum & Bignum deprecated & gộp vào Integer.
Bạn nghĩ index như mảng có thể dùng:
2[0] # 0 2[1] # 1
Nhưng bạn nhận được không phải chữ số, mà bit nhị phân tạo số đó.
Trước digits giải pháp điển hình: chuyển số thành string, tách mảng ký tự chars, chuyển từng string về integer.
Ví dụ:
123.to_s.chars.map(&:to_i).reverse # [3, 2, 1]
Nhưng thế giới sau digits bạn chỉ làm:
123.digits # [3, 2, 1]
Tốt hơn nhiều, phải không?
Video:
Phương thức Tap
Đôi khi muốn tạo đối tượng, gọi vài phương thức & trả về cùng đối tượng.
Bạn phải làm thế này:
user = User.new user.name = "John" user
Vấn đề là phải xử lý biến tạm.
Đây tap cứu cánh!
Với tap ví dụ thành:
User.new.tap { |user| user.name = "John" }
Chú ý biến tạm biến mất, điều tốt 🙂
Array#values_at
Nếu muốn lấy nhiều giá trị không liên tiếp từ mảng/hash bạn làm:
arr = [1,2,3,4,5] a, b, c = arr[0], arr[1], arr[4]
Hoặc dùng values_at:
arr = [1,2,3,4,5] a, b, c = arr.values_at(0, 1, 4)
Cũng dùng với hash:
hash = {bacon: 300, chocolate: 200}
p hash.values_at(:bacon, :chocolate) # [300, 200]
Hash#transform_values (Ruby 2.4)
Giả sử bạn có hash & muốn thay đổi tất cả giá trị.
Giống việc dùng Array#map.
Vấn đề map trả về mảng lồng (multi-dimensional array) thay vì hash. Cũng không có Hash#map!.
Giải pháp có thể:
h = {bacon: 200, coconut: 300}
h.each { |k,v| h[k] = v*2 }
Ví dụ nhân giá trị gấp đôi.
Kết quả:
{:bacon=>400, :coconut=>600}
Từ Ruby 2.4 cách tốt hơn:
h.transform_values! { |v| v * 2 }
Đây là phương thức từ Rails, giờ dùng được ngoài framework 🙂
Kernel#itself (Ruby 2.2)
Nếu bạn nói phương thức này trông không thú vị tôi đồng ý.
Nhưng lý do là bạn cần thấy ví dụ hay.
Giả sử mảng từ lặp & muốn đếm…
Có nhiều cách, tôi nghĩ đây case tốt test Kernel#itself.
Ví dụ:
words = %w(cat cat tiger dog cat) words.group_by(&:itself).transform_values(&:size)
Chú ý tôi kết hợp với Hash#transform_values!
Nếu transform_values chưa có bạn làm:
words
.group_by(&:itself)
.each_with_object({}) { |(k,v), hash| hash[k] = v.size }
Video:
Lưu ý: itself hiện dưới class Object trong docs, nhưng định nghĩa trên module Kernel.
Array#count
Đôi khi chỉ cần đếm cái gì.
Thay vì counter + loop dùng count!
Ví dụ:
letters = %w(a a a b c d a)
letters.count("a") # 4
Phiên bản mảng nhận block, đếm phức tạp hơn.
numbers = [1,2,3,4,5,6] numbers.count(&:even?) # 3
Video:
Enumerable#cycle
Muốn lặp lại mẫu? Hoặc cần toggle on/off dễ?
Enumerable#cycle có thể giúp!
Ví dụ:
array = %w(a b c) # Giống array * 3 array.cycle(3).to_a
Nhưng cách dùng yêu thích là tạo đối tượng “switch” hoặc “toggle”.
switch = %w(on off).cycle switch.next
Điều hay là không cần kiểm tra giá trị hiện tại để cập nhật thủ công.
Chỉ gọi next & Ruby biết chính xác làm gì 🙂
Tóm tắt
Bạn đã học vài phương thức hữu ích: Integer#digits, Kernel#tap, Array#values_at, Hash#transform_values, Kernel#itself, Array#count, Enumerable#cycle.
Nếu đã biết tuyệt! Nếu chưa hy vọng hữu ích 🙂
Thích bài này? Chia sẻ cho bạn bè để họ tận hưởng!