實體方法與類別方法:從字面上解釋的話,就是作用在實體的方法稱作實體方法,而作用在類別的方法稱為類別方法。
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 你哪位?
第二個問題:一樣都是方法,但是要分寫法?
類別的方法存取限制主要為三種: 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的網站