Ruby's Louvre

每天学习一点点算法

导航

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 # (NoMethodError)

当中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语法糖,第三种是极晚绑定,此方法只对那一个实例有效。

posted on 2010-03-31 22:15  司徒正美  阅读(5469)  评论(0编辑  收藏  举报