Các phương thức sơ thẩm được định nghĩa bên trong một khối định nghĩa lớp. Các phương thức lớp được định nghĩa là các phương thức singleton trên lớp singleton của một lớp, còn được gọi một cách không chính thức là "metaclass" hoặc "eigenclass". private
không phải là một từ khóa, mà là một phương thức ( Module # private ).
Đây là một cuộc gọi đến phương thức self#private
/ A#private
mà "bật tắt" quyền truy cập riêng cho tất cả các định nghĩa phương thức cá thể sắp tới cho đến khi được bật khác:
class A
private
def instance_method_1; end
def instance_method_2; end
# .. and so forth
end
Như đã lưu ý trước đó, các phương thức lớp thực sự là các phương thức singleton được định nghĩa trên lớp singleton.
def A.class_method; end
Hoặc sử dụng một cú pháp đặc biệt để mở phần định nghĩa của lớp A, ẩn danh của A:
class << A
def class_method; end
end
Người nhận "tin nhắn riêng" - tự - bên trong class A
là đối tượng lớp A. tự bên trong class << A
khối là một đối tượng khác, lớp đơn.
Ví dụ sau đây trong thực tế gọi hai phương thức khác nhau được gọi là riêng tư , sử dụng hai người nhận hoặc mục tiêu khác nhau cho cuộc gọi. Trong phần đầu tiên, chúng ta định nghĩa một phương thức cá thể riêng ("trên lớp A"), trong phần sau chúng ta định nghĩa một phương thức lớp riêng (trên thực tế là một phương thức singleton trên đối tượng lớp singleton của A).
class A
# self is A and private call "A.private()"
private def instance_method; end
class << self
# self is A's singleton class and private call "A.singleton_class.private()"
private def class_method; end
end
end
Bây giờ, viết lại ví dụ này một chút:
class A
private
def self.class_method; end
end
Bạn có thể thấy lỗi [mà các nhà thiết kế ngôn ngữ Ruby] mắc phải không? Bạn chuyển đổi quyền truy cập riêng cho tất cả các phương thức cá thể sắp tới của A, nhưng tiến hành khai báo một phương thức singleton trên một lớp khác, lớp singleton.