Tra cứu phương thức

Một phần của tài liệu Tìm hiểu ngôn ngữ lập trình Ruby (Trang 33)

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ì quá 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 toàn bộ quá 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ế quá 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 :

Có vẻ như Ruby cần phải thực hiện một quá trình tìm kiếm toà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.

Một phần của tài liệu Tìm hiểu ngôn ngữ lập trình Ruby (Trang 33)