+4

Các trick ruby để cải thiện code của bạn

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

Bạn có thể tạo 1 hash từ 1 danh sách các giá trị bằng cách sử dụng Hash[] :

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

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

2. Lambda Literal ->

Một cách mới để định nghĩa scope trong Rails:

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

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

3. Double star (**)

2 dấu * là một mẹo nhỏ khá gọn trong Ruby.

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

a là tham số thông thường. *b sẽ lấy tất cả các tham số sau tham số đâu tiên (đã được sử dụng dành cho a) và đặt chúng vào 1 mảng. c** sẽ lấy tất cả các tham số có format key: value và tạp thành hash.

Ví dụ:

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

4. Xử lý một đối tượng và một mảng theo cùng cách

Đôi khi bạn muốn cung cấp một tùy chọn phù hợp với cả một object hoặc một mảng. Thay vì kiểm tra loại đội tượng bạn nhận được, bạn có thể sử dụng [*something] hoặc Array(something)

Giả sử có 2 biến như sau:

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

Sử dụng [*...]:

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

Tương tự khi sử dụng Array(...):

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

5. Double Pipe Equals ||=

Đây là 1 công cụ tuyệt vời để rút gọn code.

Nó tương đương với:

a || a = b # Correct

Chứ không phải:

a = a || b # Wrong

Ví dụ:

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

Bây giờ dù bạn có một phương thức total khác để lấy tổng giá trị thì nó cũng chỉ lấy giá trị của lần gọi đầu tiên.

6. Tham số bắt buộc

Thay vì chỉ xác định một phương thức có hash là tham số như thế này:

def my_method({})
end

Bạn có thể chỉ định các key mà bạn mong muốn, thậm chí là xác định giá trị mặc định cho chúng. Ví dụ với ab là các tham số bắt buộc.

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

Nếu chúng ta gọi hàm mà không truyền b vào thì nó sẽ không hoạt động:

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

c có giá trị mặc định nên chúng ta có thể gọi hàm chỉ với ab

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

Hoặc tất cả chúng, khi đó giá trị của c truyền vào sẽ thay thế cho giá trị "default"

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

Bạn cũng có thể khai báo sẵn 1 hash rồi truyền vào hàm như một tham số.

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

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

Bạn có thể tạo một danh sách các số hoặc đặt toàn bộ bảng chữ cái trong một mảng.

A to 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"]

1 to 10

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

8. Tap

Tap là một hàm nhỏ để cải thiện khả năng đọc code. Ví dụ ta có một class sau:

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

Giả sử bạn muốn tạo một người dùng mới và gán các giá trị cho mỗi attributes của nó.

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

Ta cũng có thể dùng tap để làm điều này:

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

Nguồn

https://devblast.com/b/ruby-tricks-improve-code


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.