Không có thứ như "các lớp một phần" trong Ruby. Các lớp một phần là một tính năng của C#, chứ không phải Ruby.
Trong Ruby, một biểu thức định nghĩa lớp sẽ thực thi bất kỳ thứ gì bên trong nó trong ngữ cảnh của lớp. Bạn có thể có nhiều biểu thức khai báo lớp như bạn muốn, nó không quan trọng. Điều này cho phép bạn định nghĩa từng phần của lớp, ngay cả trong các tệp khác nhau, ngay cả trong các thư viện khác nhau. Nó cũng cho phép ai đó khác để (lại) xác định lớp học của bạn sau này. Trong Python, điều này được gọi là "khỉ vá" và thường cau mày, cộng đồng Ruby đã áp dụng thuật ngữ này nhưng với một ý nghĩa trung lập, bởi vì, trong Ruby thực sự là tất cả các định nghĩa lớp là khỉ vá!
Vì vậy, những gì bạn có trên
- sẽ Sửa đổi định nghĩa lớp của
A
nếu A
đã tồn tại hoặc tạo ra một lớp mới nếu nó không.
- Sửa đổi định nghĩa lớp học
B
nếu B
đã tồn tại hoặc tạo một lớp mới nếu không. (Nên B
đã tồn tại nhưng có một lớp cha khác nhau mà không phải là A
, điều này sẽ nâng cao một TypeError "superclass mismatch"
.)
- Sửa đổi định nghĩa lớp của
A
(kể từ A
đã được xác định).
- Sửa đổi định nghĩa lớp học
B
(kể từ khi B
đã được xác định). Chúng tôi có thể đã bỏ qua siêu lớp, trong trường hợp đó, lớp cha hiện tại của B
(tức là A
) sẽ được giả định.
Nhân tiện: nói kỹ thuật, A
và B
không phải là lớp học. Chúng là các biến (chính xác hơn, hằng số) mà tham chiếu cho các lớp. Các lớp là các đối tượng giống như các biến khác, chúng có thể được tham chiếu bởi các biến, được chuyển thành các đối số cho các phương thức, được trả về từ các phương thức, vv. biểu hiện:
class Foo < if rand < 0.5 then String else Array end
end
là hoàn toàn hợp lệ (và hoàn toàn vô dụng ;-))
class Foo < Bar; end
def qux(sym); const_get(sym) end
class Foo < qux(:Bar); end
cũng là hoàn toàn hợp lệ và sẽ không tạo ra sự không phù hợp cha, bởi vì hằng Bar
và phương pháp gọi qux(:Bar)
cả hai đều trả về cùng một đối tượng (đó là một lớp).
Nguồn
2014-07-27 12:41:37
Cảm ơn @ Jörg W Mittag đã sửa tôi về định nghĩa "lớp học một phần". Tôi đã đi qua tất cả các câu trả lời, và tôi nghĩ tất cả các bạn đều đúng. Nhưng Uri Agassi đã rõ ràng và đơn giản hơn, tôi muốn chọn nó như là giải pháp cho những người khác tham khảo. Cảm ơn tất cả một lần nữa. – zgcharley