Try   HackMD

Ruby 物件導向程式設計 OOP

tags: Ruby, OOP

物件 = 狀態(名詞) + 行為(動詞)
在 Ruby 裡,幾乎什麼東西都是物件
那什麼不是物件?block

類別與實體 class and instance

定義類別 & 使用類別

class Cat # 類別的命名規定 = 必須是常數 def eat(food) puts "#{food} 好好吃!!" end end kitty = Cat.new kitty.eat "鮪魚罐頭" #=> 印出「鮪魚罐頭 好好吃!!」 nancy = Cat.new nancy.eat "小魚餅干" #=> 印出「小魚餅干 好好吃!!」

繼承 inheritance

把共同的特徵放在同一個分類(class)
與其說是繼承,不如說是分類

# 請建立一個小狗 Dog 類別及一個小貓 Cat 類別,並從都是繼承自動物 Animal 類別,而且都有實作走路 walk 及吃東西 eat 這兩個方法。 class Animal def walk # 實作 end def eat # 實作 end end class Dog < Animal end class Cat < Animal end

物件的初始化

初始化

class Cat def initialize puts "hello 你好" end end kitty = Cat.new # 什麼都不用做,一出生就會打招呼

new 的時候也可以順便帶東西給它

車輪餅有紅豆口味、奶油口味
傳給 new 方法的引數,後續會由 initialize 方法收

class Cat def initialize(name, age) @name = name @age = age end end kitty = Cat.new("kitty", 18)

實體方法與類別方法

# 實體方法 instance method class Cat def say_hello puts "你好" end end kitty = Cat.new kitty.say_hello # 類別方法 class method # 方法前面加上 self class Cat def self.all puts "全部的貓兒" end end Cat.all

哪裡會用到類別方法?

class CandidatesController < ApplicationController def index @candidates = Candidate.all # 類別方法 end end

實體變數與類別變數

實體變數:@username
類別變數:@@username

實體變數

實體變數存活在每個獨立的實體內
實體變數 = 在實體裡面可自由取用的變數

class Cat def initialize(name) @name = name end def say_my_name return @name end end kitty = Cat.new('kitty') puts kitty.say_my_name # 會印出什麼? # 實體變數在實體裡可自由取用,但在實體外就不行了 # Ruby 根本沒有屬性這回事 puts kitty.name # 會印出什麼?

getter & setter

class Human def initialize(name) @name = name end def name # getter @name end def name=(new_name) # setter @name = new_name end end emily = Human.new('emily') puts emily.name # emily emily.name = 'KOKO'

attr_reader / attr_writer / attr_accessor

class Human attr_accessor :name def initialize(name) @name = name end end

Rails 裡的 View 可以使用 Controller 建立的實體變數是怎麼回事?

cc = CandidatesController.new # MVC 結構裡的 C cc.action(:index) # 執⾏了某個 action

類別變數

類別變數是 @@ 開頭的
類別變數 = 在類別方法裡面可取用的變數

class Cat @@count = 0 # 類別變數 def initialize @@count += 1 end def self.counter @@count end end 5.times { Cat.new } p Cat.counter # 印出 5