7 tips cần biết để viết code Ruby tốt hơn
Hiệu suất của Ruby on Rails chịu ảnh hưởng bởi rất nhiều yếu tố, đặc biết là cấu hình của máy chủ triển khai. Tuy nhiên, các đoạn mã có thể tạo ra một sự khác biệt lớn dù trang web của bạn chậm hoặc đáp ứng cao. Trong bài viết này mình sẽ giới thiệu với các bạn một số hàm thú vị có thể bạn chưa ...
Hiệu suất của Ruby on Rails chịu ảnh hưởng bởi rất nhiều yếu tố, đặc biết là cấu hình của máy chủ triển khai. Tuy nhiên, các đoạn mã có thể tạo ra một sự khác biệt lớn dù trang web của bạn chậm hoặc đáp ứng cao.
Trong bài viết này mình sẽ giới thiệu với các bạn một số hàm thú vị có thể bạn chưa từng gặp trước đây, nó có thể tăng hiệu suất và chất lượng khi viết code của Ruby on Rails.
Integer#digits
Đây là hàm mới được giới thiệu trong Ruby 2.4, bạn sẽ thấy nó rất hữu ích khi làm việc với các chữ số của một số nguyên.
Bạn có thể áp dụng lập chỉ mục trong một mảng:
2[0] # 0 2[1] # 1
Ở đây giá trị bạn nhận được không phải là nhưng chữ số, nhưng nó được tạo bởi các bit nhị phân
Thế nên pre-digits method đã chuyển đổi số thành chuỗi ký tự, sau đó tách chuỗi thành một mảng ký tự bằng cách sử dụng chars method và cuối cùng chuyển đổi mỗi ký tự thành một sô nguyên. Ví dụ:
1 2 3 123.to_s.chars.map(&:to_i).reverse [3, 2, 1]
Sử dụng digits
2 3 123.digits [3, 2, 1]
Tap
Thông thường bạn hay tạo một object theo cách:
user = User.new user.name = "John" user
Nhưng ở đây sẽ gặp vấn đề cách sử dụng biến tam thời.
Với tap method sẽ giải quyết vấn đề này
User.new.tap { |user| user.name = "John" }
Array#values_at
Nếu bạn muốn nhận được nhiều giá trị không tuần tự từ một mảng hoặc một băm bạn có thể làm điều này:
arr = [1,2,3,4,5] a, b, c = arr[0], arr[1], arr[4]
Hoặc sử dụng values_at method:
arr = [1,2,3,4,5] a, b, c = arr.values_at(0, 1, 4)
Áp dụng values_at đối với một hash:
hash = {bacon: 300, chocolate: 200} p hash.values_at(:bacon, :chocolate) # [300, 200]
Hash#transform_values
Với trường hợp bạn có một hash và bạn muốn thay đổi tất cả các giá trị trong hash với lý do nào đó.
Áp dụng Array#map
Sử dụng map, bạn sẽ gặp vấn đề kết quả trả về sẽ là array-of-array (mảng đa chiều), bạn cũng không thể áp dụng Hash#map
Khi đó bạn có thể làm như sau: (với ví dụ nhân đôi mỗi giá trị 2 lần)
h = {bacon: 200, coconut: 300} h.each { |k,v| h[k] = v*2 } #{:bacon=>400, :coconut=>600}
Với Ruby 2.4 bạn có thể áp dụng:
h.transform_values! { |v| v * 2 }
Kernel#itself
Ví dụ: Chúng ta có mảng với những từ lặp lại và bạn muốn đếm chúng. Có thể có rất nhiều cách để giải quyết bài toán này, nhưng với trường hợp này bạn có thể áp dụng Kernel#itself bạn sẽ thấy điểm hữu ích của nó:
words = %w(cat cat tiger dog cat) words.group_by(&:itself).transform_values(&:size)
Nếu không áp dụng transform_values:
words .group_by(&:itself) .each_with_object({}) { |(k,v), hash| hash[k] = v.size }
Array#count
Ví dụ:
letters = %w(a a a b c d a) letters.count("a") # 4
Bạn cũng có thể áp dụng cho block:
numbers = [1,2,3,4,5,6] numbers.count(&:even?) # 3
Enumerable#cycle
Ví dụ:
array = %w(a b c) # Same as array * 3 array.cycle(3).to_a
Áp dụng cycle:
switch = %w(on off).cycle switch.next
Tổng kết
Đây là một số hàm đã học được hy vọng bạn sẽ thấy chúng hữu ích: Integer#digits, Kernel#tap, Array#values_at, Hash#transform_values, Kernel#itself, Array#count, Enumerable#cycle. Tài liệu: https://www.rubyguides.com/2017/10/7-powerful-ruby-methods/