Computer >> Máy Tính >  >> Lập trình >> Ruby

Phương pháp riêng tư &được bảo vệ của Ruby:Hiểu được khả năng hiển thị của phương pháp

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 🙂