[Ruby] 實體方法Instance Method與類別方法Class Method

Wendy Wu
W-Learning Note
Published in
3 min readSep 14, 2019

顧名思義,class method就是class呼叫的,instance method就是instance呼叫的(廢話),直接先來看個例子:

hello 是class method,所以可以用Welcome class呼叫,而 hello_2 是instance method,用Welcome class呼叫會跳出undefined method的error,而使用Welcome.new這個instance呼叫這兩個method,則情況相反。

Class Methods

有幾種方法可以定義class method

# 1
class Foo
def self.bar
puts 'This is class method'
end
end
# 2
class Foo
class << self
def bar
puts 'This is class method'
end
end
end
# 3
class Foo; end
def Foo.bar
puts 'This is class method'
end

這三種用 Foo.bar 呼叫的結果都一樣,前兩種是較常見的定義方式,第一種能一眼看出是class method,第二種在class << self 這個block中,可以定義多個class method,但相較之下也比較難一眼看出是class method還是instance method,而最後一種方式則比較少見。

Instance Methods

# 1
class Foo
def bar
puts 'This is instance method'
end
end
Foo.new.bar# 2
class Foo
attr_accessor :bar
end

foo = Foo.new
foo.bar = 'This is instance method'
puts foo.bar
# 3
class Foo; end

foo = Foo.new
def foo.bar
puts 'This is instance method'
end

Foo.new.bar

這三種方式一樣也能得到同樣的output,重點在於instance method需要用instance呼叫,所以需要先創造一個新的instance(Foo.new)

使用時機

當方法不會和特定的instance有關時,就可以使用class method,例如 ActiveRecord::Base的find 就是一個例子: User.find(id)

那麼,當方法需要和某個特定的instance綁在一起時,就需要用instance method,例如destroy : jack=User.find(1); jack.destroy

以上是很簡單的對class method和instance method做比較,網路上有很多大神都有寫過這樣相關的文章,也可以看出這是Ruby新手常常會搞混的地方啊😭

參考:

--

--