Phương thức private trong Ruby là gì?
Đây là một loại phương thức mà bạn CHỈ có thể gọi từ bên trong lớp mà nó được định nghĩa.
Điều này cho phép bạn kiểm soát quyền truy cập vào các phương pháp của mình.
Một phương thức Ruby có thể là :
- riêng tư
- công khai (mặc định)
- được bảo vệ
Theo mặc định, TẤT CẢ các phương thức của bạn là public
.
Bất kỳ ai cũng có thể sử dụng chúng!
Nhưng bạn có thể thay đổi điều này bằng cách đặt một phương thức private
hoặc protected
.
Tại sao điều này hữu ích?
Vì bạn có thể thay đổi các phương pháp này dễ dàng hơn.
Hãy tưởng tượng bạn đang viết một thư viện mã sẽ được sử dụng trong một số dự án khác nhau tại nơi làm việc.
Khi các dự án này triển khai thư viện của bạn, chúng sẽ gọi các phương thức trên các lớp mà bạn đã tạo.
Bây giờ :
Bạn phát hành một phiên bản mới…
Nhưng bạn đã quyết định thay đổi tên trên public
phương pháp.
Điều đó sẽ tạo ra lỗi trên mọi dự án đang sử dụng phương pháp này!
Hãy nhớ điều này :
Bằng cách có ÍT phương thức công khai, bạn TĂNG quyền tự do thay đổi bên trong lớp của mình.
Hãy xem một vài ví dụ về mã!
Hiểu các phương thức riêng trong Ruby
Bạn đã bao giờ thấy thông báo lỗi "phương thức riêng tư được gọi là" chưa?
Cái này :
self.puts 123 # NoMethodError: private method `puts' called
Sau đó, bạn đã cố gắng sử dụng private
phương pháp không chính xác.
Bạn chỉ có thể sử dụng một phương thức riêng tư của chính nó.
Ví dụ :
puts 123
Nó là cùng một phương pháp, nhưng bạn phải gọi nó như thế này.
Các phương thức riêng luôn được gọi trong ngữ cảnh của self
.
Nói cách khác…
Bạn chỉ có thể sử dụng các phương pháp riêng tư với :
- Các phương thức khác từ cùng một lớp
- Các phương thức được kế thừa từ lớp cha
- Các phương thức được bao gồm từ một mô-đun
Điều này có nghĩa là bạn không thể gọi các phương thức riêng tư từ bên ngoài lớp định nghĩa chúng.
Bởi vì điều đó sẽ yêu cầu một "người nhận rõ ràng".
Trừ khi…
Bạn sử dụng một phương thức như send
để bỏ qua quy tắc này.
send(:puts, "apple")
Làm cách nào để bạn xác định một private
phương pháp?
Như thế này :
def bacon "private bacon" end private :bacon
Từ private
bản thân nó không phải là một từ khóa, nó là một phương thức được xác định trên Kernel
mô-đun.
Nơi đặt các phương thức riêng tư của bạn
Việc một lớp có nhiều hơn một phương thức private là điều bình thường.
Bạn đặt các phương pháp này ở đâu?
Làm điều này :
class Food def public_method end private def bacon end def orange end def coconut end end
Mọi phương thức phiên bản sau private
trở thành một phương thức riêng tư.
Bạn có thể sử dụng
private_class_method :method_name
nếu bạn muốn xác định một phương thức lớp là private
Đó là một mẫu chung để xác định tất cả các phương thức công khai của bạn trước, sau đó xác định private
của bạn ở cuối lớp.
Phương thức công khai
Công khai là khả năng hiển thị phương thức mặc định trong Ruby.
Đây là một ví dụ :
def orange "Vitamin C" end
Nếu bạn có một đối tượng food
xác định orange
, bạn có thể gọi nó như thế này:
food.orange
Nếu một phương thức đã được đặt ở chế độ riêng tư hoặc được bảo vệ, bạn có thể đặt nó ở chế độ công khai lại.
Như thế này :
public :orange
Phương pháp được bảo vệ là gì?
Các phương pháp được bảo vệ ít phổ biến hơn.
Chúng giống như private
nhưng bạn có thể gọi chúng trên một đối tượng chứ không chỉ trực tiếp.
Nếu bạn hãy thử ví dụ này với chế độ riêng tư bạn sẽ gặp lỗi:
class Food def initialize(name) @name = name end def ==(other) name == other.name end protected attr_reader :name end food = Food.new("chocolate") puts food == food
Bạn gặp lỗi vì name
sẽ là riêng tư nên bạn không thể làm other.name
.
Nhưng với protected
mã này hoạt động!
Phương thức riêng tư so với phương pháp được bảo vệ
Đó là sự khác biệt, thực tế là protected
giữ phương thức private
, nhưng nó cũng cho phép bạn gọi phương thức đó trên một đối tượng.
Với chế độ riêng tư, bạn chỉ có thể thực hiện name
, với sự bảo vệ, bạn có thể thực hiện object.name
.
Khi nào bạn nên sử dụng bảo vệ?
Chỉ khi bạn có một trường hợp rất cụ thể, chẳng hạn như dấu bằng (==
) phương pháp.
Tài liệu Ruby khuyên bạn nên sử dụng private
thay vì protected
bất cứ khi nào có thể.
Và có ghi chú này :
“Phương pháp được bảo vệ chậm vì nó không thể sử dụng bộ nhớ đệm nội tuyến.”
Tôi tò mò về điều này nên tôi đã chạy một số điểm chuẩn :
public: 2813891.9 i/s private: 2699273.8 i/s protected: 2572122.0 i/s
Đó là sự khác biệt 8,5% về hiệu suất.
Hướng dẫn bằng Video
Tóm tắt
Bạn đã tìm hiểu về khả năng hiển thị của phương thức Ruby, các phương thức công khai, riêng tư và được bảo vệ. Đây không phải là từ khóa của Ruby , chúng là các phương thức được định nghĩa trên Module
lớp học.
Hãy chia sẻ bài đăng này để nhiều người có thể hiểu được chủ đề này!
Cảm ơn vì đã đọc 🙂