This page is READ-ONLY. It is generated from the old site.
All timestamps are relative to 2013 (when this page is generated).
If you are looking for TeX support, please go to VietTUG.org

ưu tiên :)

ngố
Added by almost 3 years ago  »  Votes: 2/2

Xét ví dụ sau

1 # ... các phép xử lý trên st
2 ret = []
3 ret << st ? st.downcase : nil
Mục đích của đoạn mã là xác định mảng ret tùy theo giá trị của st:
  1. Nếu biến stnil (chưa được nghĩa hoặc gán bằng nil), thì ret trở thành [nil] (mảng gồm một phần tử nil),
  2. còn ngược lại, kết quả là [st.downcase] là một mảng chứa chuỗi chữ thường tương ứng với st. Ví dụ, nếu stAbc Def thì kết quả là ["abc def"].

Ý tưởng là vậy, còn thực tế thì sao? Nếu chuỗi st khác nil, sau khi thực hiện hai dòng trên, ret vẫn không thay đổi. Còn khi st == nil, trình thông dịch sẽ báo lỗi undefined method `downcase' for nil:NilClass. Lạ chưa. Phép kiểm tra chính xác mà !?

Bí mật là ở chỗ, dòng thứ hai được trình thông dịch hiểu một cách chính xác là

1 (ret << st) ? st.downcase : nil

Do ret luôn trả về [ret] khác nil, lệnh st.downcase luôn luôn được thực hiện, bất kể st thế nào. Điều đó giải thích tại sao, khi stnil thì phát sinh lỗi đã nói.

Mã đúng phải là

1 # ... các phép xử lý trên st
2 ret = []
3 ret << (st ? st.downcase : nil)

Thay vì nhớ các quy tắc, việc dùng chắc chắn, tường minh các dấu ngoặc sẽ làm mã dễ hiểu và tránh gặp các lỗi logic thông thường.


Comments