ruby的類方法與實例方法
類方法也叫靜態方法,通過類名來調用的方法。實例方法,必須要new一個實例出來才能用。
class Foo |
def self.bar
|
puts 'class method'
|
end
|
|
def baz
|
puts 'instance method'
|
end
|
end |
Foo.bar #class method
|
#Foo.baz #報錯 undefined method `baz' for Foo:Class (NoMethodError) |
Foo. new .baz #instance method
|
#Foo.new.bar #報錯 undefined method `bar' for #<foo:0x2d61a1c> (NoMethodError) |
</foo:0x2d61a1c> |
當中bar就是類方法,看它是如何定義的:def self.bar,self就是指向當前的類。而對於實例方法,就很簡單:def baz。
像ruby這樣靈活的腳本語言不多見,它提供了多種定義類方法的手段。
# Way 1 |
class Foo |
def self.bar
|
puts 'class method'
|
end
|
end |
Foo.bar # "class method"
|
# Way 2 |
class Foo |
class << self
|
def bar
|
puts 'class method'
|
end
|
end
|
end |
Foo.bar # "class method"
|
# Way 3 |
class Foo; end |
def Foo.bar |
puts 'class method'
|
end |
Foo.bar # "class method"
|
第一種與第三種方式不細說了,self的運用就相當於javascript的this。第二種有種自繼承的意味。通過我們添加多個類方法時就少寫幾個self,非常優雅。
再看實例方法,這也有幾套方案:
# Way 1 |
class Foo |
def baz
|
puts 'instance method1'
|
end
|
end |
Foo. new .baz # "instance method1"
|
puts '---------------'
|
# Way 2 |
class Foo |
attr_accessor :baz
|
end |
foo = Foo. new
|
foo.baz = 'instance method2'
|
puts foo.baz # "instance method2"
|
puts '---------------'
|
# Way 3 |
class Foo; end |
foo = Foo. new
|
def foo.lazy |
puts 'instance method3'
|
end |
轉載自:http://www.cnblogs.com/rubylouvre/archive/2010/03/31/1701780.html |