類方法也叫靜態方法,通過類名來調用的方法。執行個體方法,必須要new一個執行個體出來才能用。
class Foo def self.bar puts 'class method' end def baz puts 'instance method' endendFoo.bar #class method#Foo.baz #報錯 undefined method `baz' for Foo:Class (NoMethodError)Foo.new.baz #instance method#Foo.new.bar #報錯 undefined method `bar' for #<0x2d61a1c> (NoMethodError)
當中bar就是類方法,看它是如何定義的:def self.bar,self就是指向當前的類。而對於執行個體方法,就很簡單:def baz。
像ruby這樣靈活的指令碼語言不多見,它提供了多種定義類方法的手段。
# Way 1class Foo def self.bar puts 'class method' endendFoo.bar # "class method"# Way 2class Foo class 第一種與第三種方式不細說了,self的運用就相當於javascript的this。第二種有種自繼承的意味。通過我們添加多個類方法時就少寫幾個self,非常優雅。
再看執行個體方法,這也有幾套方案:
# Way 1class Foo def baz puts 'instance method1' endendFoo.new.baz # "instance method1"puts '---------------'# Way 2class Foo attr_accessor :bazendfoo = Foo.newfoo.baz = 'instance method2'puts foo.baz# "instance method2"puts '---------------'# Way 3class Foo; endfoo = Foo.newdef foo.lazy puts 'instance method3'endfoo.lazy # "instance method3"
第一種直接定義,第二種用到attr_accessor文法糖,第三種是極晚綁定,此方法只對那一個執行個體有效。