10 ruby tricks có thể improve code của bạn

Trong bài viết này, tôi muốn giới thiệu cho bạn 10 trick khá hay mà bạn có thể biết hoặc không. Dù sao, nó cũng không tốn nhiều thời gian và cũng khá thú vị.

1.Tạo 1 hash từ danh sách các giá trị

Ví dụ

Hash['key1', 'value1', 'key2', 'value2']

=> {"key1"=>"value1", "key2"=>"value2"}

2.Lambda Literal ->

Được giới thiệu gầ đây như 1 cách khác để định nghĩa các scope, kí tự -> cho phép bạn tạo ra các lambda rất dễ dàng

a = -> { 1 + 1 }
a.call
# => 2

a = -> (v) { v + 1 }
a.call(2)
# => 3

3.Double star ( ** )

Chúng ta xét method sau đây

def my_method(a, *b, **c)
  return a, b, c
end

a là một tham số bình thường. *b sẽ đưa các tham số vào 1 array. **c sẽ lấy các tham số theo định dạng key: value ở cuối method.

1 tham số:

my_method(1)
# => [1, [], {}]

nhiều hơn 2 tham số:

my_method(1, 2, 3, 4)
# => [1, [2, 3, 4], {}]

nhiều hơn 2 tham số và định dạng hash:

my_method(1, 2, 3, 4, a: 1, b: 2)
# => [1, [2, 3, 4], {:a=>1, :b=>2}]

4.Xử lý single object và array theo cùng 1 cách

Đôi khi chúng ta muốn đưa ra tùy chọn hoặc là chấp nhận 1 object, hoặc là 1 mảng các object. Thay vì việc kiểm tra xem đó là object hay array, chúng ta có thể sử dụng [*something] hoặc Array(something).

Ví dụ, chúng ta sẽ tạo 2 variable, 1 là số và 1 là 1 array các số

stuff = 1
stuff_arr = [1, 2, 3]

Sử dụng [*...] để gọi vòng lặp

[*stuff].each { |s| s }
[*stuff_arr].each { |s| s }

Tưởng tự với Array(...)

Array(stuff).each { |s| s }
Array(stuff_arr).each { |s| s }

5.Double Pipe Equals ||=

Đơn giản thì nó là 1 công cụ tuyệt vời để chúng ta code 1 cách ngắn gọn. Ví dụ như cách viết sau để tính total value

def total
  @total ||= (1..100000000).to_a.inject(:+)
end

6.Mandatory hash parameters

Trong ruby 2.0, khi cần định nghĩa 1 method dùng hash parametter ta viết như sau

def my_method({})
end

Bạn có thể chỉ định các key mà chúng ta mong muốn có, hoặc set các giá trị amwcj định cho chúng.

def my_method(a:, b:, c: 'default')
  return a, b, c
end

Trong trường hợp chúng ta gọi hàm mà không có tham số b:

my_method(a: 1)
# => ArgumentError: missing keyword: b

Tham số c có giá trị default, vì vậy chúng ta có thể gọi hàm chỉ với tham số a và b:

my_method(a: 1, b: 2)
# => [1, 2, "default"]

Hoặc với cả 3 tham số:

my_method(a: 1, b: 2, c: 3)
# => [1, 2, 3]

Hoặc, bạn có thể truyền vào 1 hash:

hash = { a: 1, b: 2, c: 3 }
my_method(hash)
# => [1, 2, 3]

7.Tạo các mảng chữ hoặc số

Nếu bạn muốn tạo 1 danh sách các số hoặc đưa toàn bộ các chữ cái vào trong 1 mảng, bạn có thể sử dụng ranges

Từ a - z

('a'..'z').to_a
# => ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]

Từ 1 - 10

 (1..10).to_a
# => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

8.Tap

Sử dụng tap là 1 phương pháp làm code của bạn dễ đọc hơn. Chúng ta xét 1 ví dụ:

class User
  attr_accessor :a, :b, :c
end

Bay giờ, chúng ta sẽ tạo 1 user mới và gán giá trị cho các attribute. Chúng ta có thể làm như sau:

def my_method
  o = User.new
  o.a = 1
  o.b = 2
  o.c = 3
  o
end

Hoặc bạn có thể dùng tap để làm điều đó

def my_method
  User.new.tap do |o|
    o.a = 1
    o.b = 2
    o.c = 3
  end
end

9. Default value for hash Theo mặc định, khi chúng ta cố gắng gán 1 giá trị chưa được định nghĩa cho 1 hash, chúng ta sẽ nhận được nil. Điều này có thể được thay đổi khi khởi tạo hash.

Tuy nhiên đừng làm điều này trừ khi bạn biết những gì bạn đang làm.

Ở ví dụ sau, chúng ta định nghĩa hash với giá trị mặc định là 0, nó sẽ trả về 0 khi ta gọi a[:a] chứ không phải là nil:

a = Hash.new(0)
a[:a]
# => 0

Chúng ta có thể pass bất cứ thứ gì với Hash initializer

a = Hash.new({})
a[:a]
# => {}

Hoặc là

a = Hash.new('lolcat')
a[:a]
# => "lolcat"

10.heredocs Sự khó chịu mà các khoảng thụt đầu dòng đem lại khi nhìn vào code:

def my_method
  <<-EOT
Some
Very
Interesting
Stuff
  EOT
end

Để khắc phục, chúng ta có thể dùng gsub với 1 đoạn regex ngắn:

def my_method
  <<-EOT.gsub(/^\s+/, '')
    Some
    Very
    Interesting
    Stuff
  EOT
end

Dịch từ samurails


All Rights Reserved