iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 15
0
Software Development

Ruby 研究 30 天系列 第 15

Day 14 - 類別方法與實體方法

實體方法與類別方法:從字面上解釋的話,就是作用在實體的方法稱作實體方法,而作用在類別的方法稱為類別方法。

實體方法

class Language
  def say_hello
    puts " Hello, world "
  end
end

ruby = Language.new
js = Language.new       # 這裡ruby,js 是實體

ruby.say_hello          # 印出 Hello, world
js.say_hello            # 印出 Hello, world

類別方法

class Language
  class << self
    def introduction
      puts " no pain no gain "
    end
  end
  
  def self.say_hello
    puts " Hello, world "
  end
end

Language.introduction   # 印出 no pain no gain  
Language.say_hello      # 印出 Hello, world 

在學習到這裡時,有種原來學寫程式語言跟學講哪國語言一樣,各自有自己的文法:
第一個問題: self 你哪位?
第二個問題:一樣都是方法,但是要分寫法?

存取控制

類別的方法存取限制主要為三種: publicprotected 以及 private

就目前的理解,這三種限制的差別為:

  • public - 在類別的內部及外部都可以取用的方法,為預設值
  • protected - 只能在類別內部取用的方法
  • private - 不能有訊息接受者的方法
class Dog  
  def bark
    puts " 我不會說 '#{ self.delicious }' 所以只能 '汪汪汪' "   # 這裡 self 可省略
  end

  protected
  def delicious
    "好吃好吃"
  end

  private
  def sleep
    "zzz..."
  end
end

husky = Dog.new

husky.bark       # 印出 我不會說 '好吃好吃' 所以只能 '汪汪汪'
husky.delicious  # 印出 protected method `delicious' called for ...
husky.sleep      # 印出 private method `sleep' called for ....

我們可以看到 delicious 身為 protected 的方法,在 class 中是能得出結果的,而且其結果一樣能藉由別的方法帶出來,然而直接在外面呼叫卻會失敗。

或是你也能這麼寫:

class Dog    
  def bark
    puts "我不會說 '#{self.delicious}' 所以只能 '汪汪汪'"
  end

  def delicious
    "好吃好吃"
  end

  def sleep
    "zzz..."
  end
  
  protected :delicious
  private :sleep
end

還記得之前 symbol 篇嗎?當我們在定義方法的時候,同時產生同名的 symbol ,這裡的存取控制其實就是方法而已,想必這裡是省略小括號了。

此文同步刊登於CJ-Han的網站


上一篇
Day 13 - 類別變數與實體變數
下一篇
Day 15 - self
系列文
Ruby 研究 30 天30

尚未有邦友留言

立即登入留言