12/08/2018, 16:18

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/

0