訪問級別

Ruby 有三個訪問級別。他們是 publicprivateprotected

遵循 privateprotected 關鍵字的方法也是如此定義的。之前的方法是隱含的 public 方法。

公共方法

公共方法應該描述正在建立的物件的行為。可以從建立的物件的範圍之外呼叫這些方法。

class Cat
  def initialize(name)
    @name = name
  end

  def speak
    puts "I'm #{@name} and I'm 2 years old"
  end
  
  ...
end

new_cat = Cat.new("garfield")
#=> <Cat:0x2321868 @name="garfield">
 
new_cat.speak
#=> I'm garfield and I'm 2 years old

這些方法是公共 ruby 方法,它們描述了初始化新 cat 的行為和 speak 方法的行為。

public 關鍵字是不必要的,但可以用來轉義 privateprotected

def MyClass
  def first_public_method
  end

  private

  def private_method
  end

  public

  def second_public_method
  end
end

私人方法

無法從物件外部訪問私有方法。它們由物件在內部使用。再次使用 cat 示例:

class Cat
  def initialize(name)
    @name = name
  end

  def speak
    age = calculate_cat_age # here we call the private method 
    puts "I'm #{@name} and I'm #{age} years old"
  end

  private
     def calculate_cat_age
       2 * 3 - 4 
     end
end

my_cat = Cat.new("Bilbo")
my_cat.speak #=> I'm Bilbo and I'm 2 years old
my_cat.calculate_cat_age #=> NoMethodError: private method `calculate_cat_age' called for #<Cat:0x2321868 @name="Bilbo">

正如你在上面的示例中所看到的,新建立的 Cat 物件可以在內部訪問 calculate_cat_age 方法。我們將變數 age 分配給執行私有 calculate_cat_age 方法的結果,該方法將貓的名稱和年齡列印到控制檯。

當我們嘗試從 my_cat 物件外部呼叫 calculate_cat_age 方法時,我們會收到一個 NoMethodError,因為它是私有的。得到它?

受保護的方法

受保護的方法與私有方法非常相似。它們不能以私有方法不能訪問物件例項之外的方式訪問。但是,使用 self ruby​​方法,可以在相同型別的物件的上下文中呼叫受保護的方法。

class Cat
  def initialize(name, age)
    @name = name
    @age = age
  end

  def speak
    puts "I'm #{@name} and I'm #{@age} years old"
  end

  # this == method allows us to compare two objects own ages. 
  # if both Cat's have the same age they will be considered equal.
  def ==(other)
     self.own_age == other.own_age
  end

  protected
     def own_age
        self.age
     end
end

cat1 = Cat.new("ricky", 2)
=> #<Cat:0x007fe2b8aa4a18 @name="ricky", @age=2>

cat2 = Cat.new("lucy", 4)
=> #<Cat:0x008gfb7aa6v67 @name="lucy", @age=4>

cat3 = Cat.new("felix", 2)
=> #<Cat:0x009frbaa8V76 @name="felix", @age=2>

你可以看到我們已經為 cat 類新增了一個 age 引數,並建立了三個具有 name 和 age 的新 cat 物件。我們將呼叫 own_age 保護方法來比較我們的貓物件的年齡。

cat1 == cat2
=> false

cat1 == cat3
=> true

看看,我們能夠使用 self.own_age 保護方法檢索 cat1 的年齡,並通過在 cat1 中呼叫 cat2.own_age 來將其與 cat2 的年齡進行比較。