Mark24
记录灵感、技术、思考
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的写法可以简化代码,把所有方法放在一起。
他背后有一个简单的想法就是像声明实例方法一样,声明类方法。
转换理解
类方法就是类具体实例的方法。其实就是单例方法。这本书太简短,没有把他们联系起来。