訪問級別
Ruby 有三個訪問級別。他們是 public
,private
和 protected
。
遵循 private
或 protected
關鍵字的方法也是如此定義的。之前的方法是隱含的 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
關鍵字是不必要的,但可以用來轉義 private
或 protected
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 的年齡進行比較。