10 ruby tricks có thể improve code của bạn
Bài đăng này đã không được cập nhật trong 8 năm
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