Phương thức try() trong Ruby on Rails
Bài đăng này đã không được cập nhật trong 8 năm
I. Phương thức try()
- Trong Rails,
try()
giúp bạn gọi các method của 1 object mà không cần lo lắng về việc object đó có phải lànil
hay không và việc gây ra cácexception
không mong muốn. Chúng ta rất hay quên việc kiểm tra trường hợpnil
nên phương thứctry()
này rất hữu ích trong việc giải quyết vấn đề này. - Phương thức
try()
được định nghĩa trong lớpObject
và lớpNilClass
. - Cú pháp:
try(method, *args, &block)
- Nếu Object gọi đến là
nil object
hoặcNilClass
, nó sẽ trả vềnil
thay vì tạo ra exceptionNoMethodError
.
II.Cách sử dụng
- Thay vì việc lúc nào cũng phải check xem
person
cónil
hay không:person.name if person
ta có thể sử dụng hàmtry
thay vì đó:
person.try(:name)
Cách viết trên tương đương với `person.nil? ? nil : person.name` do đó sẽ không có ngoại lệ nào xảy ra khi` person` gọi đến là `nil`.
try()
luôn trả vềnil
khi gọi đến đối tượng lànil
:
nil.try(:to_i) # => nil, rather than 0
`try()` cũng trả về `nil` nếu đối số truyền vào gọi đến 1 phương thức không tồn tại
person.try(:non_existing_method) # => nil
thay vì
person.non_existing_method if person.respond_to (:non_existing_method) # => nil
quá dài dòng.
try()
với đối số và block: Ta có thể viết:
people.try(:take, 5)
thay vì dùng `people.take(5)`, trong đó, tham số đầu tiên là tên phương thức cần gọi, tham số thứ 2 là tham số truyền vào của phương thức vừa gọi đó. Với block:
people.try(:collect) {|p| p.name}
Số đối số trong block phải tương ứng với số đối số trong hàm `try`, nếu không, exception `ArgumentError` vẫn có thể xảy ra.
Nếu gọi `try` với block mà không có đối số kèm theo thì block sẽ gọi đến đối tượng mà sử dụng hàm `try` đó. Ví dụ bên dưới, `p` trong block sẽ gọi đến đối tượng` person` trước hàm `try` kia.
person.try { |p| "#{p.first_name} #{p.last_name}" }
nếu phương thức gọi đến trong block là `nil` thì exception `NoMethodError` vẫn có thể xảy ra.
- Ta cũng có thể gọi 1 chuỗi các phương thức
try
một lần như sau:
User.first.try(:name).try(:downcase)
# => bui thi phan
III. Tổng kết
try
giúp code của chúng ta ngắn hơn khi phải xử lý các trường hợp nil
tuy nhiên chúng ta luôn phải nghĩ ra code ban đầu trước khi thay chúng bằng cách dùng phương thức try
.
Link tham khảo: http://api.rubyonrails.org/classes/Object.html#method-i-try
All rights reserved