12/08/2018, 13:51
Phương thức try() trong Ruby on Rails
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ác exception không mong muốn. Chúng ta rất hay quên việc kiểm tra trường hợp nil nên phương thức try() này rất hữu ích trong việc giải ...
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ác exception không mong muốn. Chúng ta rất hay quên việc kiểm tra trường hợp nil nên phương thức try() 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ớp Object và lớp NilClass.
- Cú pháp:
try(method, *args, &block)
- Nếu Object gọi đến là nil object hoặc NilClass, nó sẽ trả về nil thay vì tạo ra exception NoMethodError.
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àm try 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