[Ruby] 實體方法Instance Method與類別方法Class Method
顧名思義,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
endFoo.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新手常常會搞混的地方啊😭
參考: