Chương V : Lớp và Module
1. Tra cứu phương thức
Khi Ruby tính giá trị của biểu thức lời gọi phương thức, đầu tiên nó phải tìm được phương thức mà được gọi. Quá trình này được gọi là tra cứu phương thức hoặc phân giải tên phưong thức. Với biểu thức lời gọi phương thức o.m, Ruby thực hiện quá trình phân giả tên theo các bước sau:
1. Đầu tiên, nó kiểm tra lớp đặc trưng o để tìm phương thức singleton tên m. 2. Nếu khơng có phương thức m nào được tìm tháy, Ruby tìm trong các lớp o
phương thức tên m.
3. Nếu khơng phương thức m nào được tìm thấy, Ruby tìm các phương thức của các module có trong lớp o. Nếu lớp đó có bao gồm nhiều hơn một module, thì chúng được tìm theo thứ tự ngược lại với thứ tự chúng được đưa vào. Do đó, module được đưa vào muộn nhất sẽ đựơc tìm đầu tiên. 4. Nếu khơng có phương thức m nào đựơc thấy trong lớp o hoặc các module
của nó, thì q trình tìm kiếm sẽ được đẩy lên cấp cao hơn trong cây cấp bậc để đến lớp cha. Bước 2 và 3 được lặp lại cho mỗi lớp trên cấp thừa kế cho đến khi mọi lớp tổ tiên và các module nó chứa đều đã được tìm kiếm. 5. Nếu khơng có phương thức m nào được tìm thấy trong tồn bộ q trình
tìm kiếm, thì một phưong thức tên là method_missing sẽ được gọi thay thế. Để tìm một định nghĩa chính xác của phương thức này, thuật toán phân giải tên sẽ được bắt đầu từ bước 1. Module Kernel cung cấp một cài đặt mặc định cho method_missing, vì thế q trình phân giải tên thứ hai sẽ thành cơng.
Giả sử ta có một đoạn code sau:
message = "hello" message.world
Ta muốn gọi một phương thức tên là world cho thể hiện của lớp String "hello". Quá trình phân giải tên như sau:
1. Kiểm tra lớp lớp đặc trưng để tìm các phương thức singleton. Khơng có trường hợp nào như vậy.
2. Kiểm tra lớp String. Cũng khơng có phương thức nào tên là world.
3. Kiểm tra module Comparable và Enumerable của lớp String để tìm phương thức tên world. Khơng module nào định nghĩa phương thức đó. 4. Kiểm tra lớp cha của String, là Object. Lớp Object không định nghĩa
phương thức nào tên là world.
5. Kiểm tra module Kernel có trong Object. Phương thức world khơng được tìm thấy ở đây, vì thể ta chuyển sang tìm kiếm phương thức tên method_string.
6. Tìm method_string trong mỗi điểm ở trên (lớp đặc trưng của đối tượng
String, lớp String, module Comparable và Enumerable, lớp Object, và
module Kernel). Định nghĩa đầu tiên của method_string ta tìm thấy ở trong module Kernel, vì thế đây là phương thức ta sẽ gọi. Phương thức sẽ tạo ra một lỗi :
Bài tập lớn Nguyên lý các ngơn ngữ lập trình – Tìm hiểu về Ruby
Có vẻ như Ruby cần phải thực hiện một q trình tìm kiếm tồn diện mỗi khi nó gọi một phương thức. Tuy nhiên, trong quá trình thực hiện, các tra cứu thành cơng sẽ được cache lại do đó các tra cứu sau với cùng tên sẽ rất nhanh.