Ruby的类方法

Ruby中定义类方法有很多种形式。参考 《Ruby基础教程(第五版)》 8.2.6 类方法(page93)。


class << Helloworld
  def hello(name)
    puts "#{name} said Hello."
  end
end


class HelloWorld
  class << self
    def hello(name)
      puts "#{name} said Hello."
    end
  end
end


def HelloWorld.hello(name)
  puts "#{name} said Hello."
end


class HelloWorld
  def self.hello(name)
    puts "#{name} said Hello."
  end
end

乍一看非常灵活,会觉得做一件事的方法非常多。

但是这里有一个简化的理解方式。先介绍以下单例类定义。

如下的这种写法的类定义称为单例类定义


class << xxx
  def hello(name)
    puts "#{name} said Hello."
  end
end

使用单例类定义,可以给对象添加方法(单例方法)。


str1 = "ruby"
class << str1
  def hello(name)
    puts "#{name} said Hello."
  end
end

总之,class也是一个具体的对象,类方法就是要在类这个对象上新增方法。 然后来分析下全部的类方法声明的方式:


# 标准的单例方法声明
class << Helloworld
  def hello(name)
    puts "#{name} said Hello."
  end
end


# 这种其实就是在类的内部,使用了标准的单例方法生命
# 只不过这里的self就是class本身
class HelloWorld
  class << self
    def hello(name)
      puts "#{name} said Hello."
    end
  end
end


# 这在方式就比较直接,直接把class当作对象,绑定在上面
def HelloWorld.hello(name)
  puts "#{name} said Hello."
end


# 这个形式的写法和上面是类似的,也是找到了class直接把方法绑定在上面
class HelloWorld
  def self.hello(name)
    puts "#{name} said Hello."
  end
end

每种方法个有特色,但是都保持Ruby设计的一贯性,完全可以理解。

self写法具有一致性。« self的写法可以简化代码,把所有方法放在一起。

他背后有一个简单的想法就是像声明实例方法一样,声明类方法。

转换理解

类方法就是类具体实例的方法。其实就是单例方法。这本书太简短,没有把他们联系起来。

Mark24

Everything can Mix.