类方法也叫静态方法,通过类名来调用的方法。实例方法,必须要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 |
foo.lazy # "instance method3" |
第一种直接定义,第二种用到attr_accessor语法糖,第三种是极晚绑定,此方法只对那一个实例有效。