类具有3种类型的方法:实例,单例和类方法。
这些是可以从instance类的调用的方法。
class Thing def somemethod puts "something" end end foo =Thing.new# 创建类的实例 foo.somemethod # => something
这些是静态方法,即可以在类上调用,而不能在该类的实例上调用。
class Thing def Thing.hello(name) puts "Hello, #{name}!" end end
它等效self于代替类名。以下代码与上面的代码等效:
class Thing def self.hello(name) puts "Hello, #{name}!" end end
通过编写来调用方法
Thing.hello("John Doe") # prints: "Hello, John Doe!"
这些仅适用于该类的特定实例,而不适用于所有实例。
# 创建一个空类 class Thing end # 该类的两个实例 thing1 = Thing.new thing2 = Thing.new # 创建一个单例方法 def thing1.makestuff puts "I belong to thing one" end thing1.makestuff # => prints: I belong to thing one thing2.makestuff # NoMethodError: undefined method `makestuff' for #<Thing>
无论是singleton和class方法被称为eigenclassES。基本上,ruby所做的是创建一个包含此类方法的匿名类,以便它不会干扰所创建的实例。
另一种方法是通过class <<构造函数。例如:
# 类方法(与上面的示例相同) class Thing class << self # 匿名类 def hello(name) puts "Hello, #{name}!" end end end Thing.hello("sarah") # => Hello, sarah! # 单例法 class Thing end thing1 = Thing.new class << thing1 def makestuff puts "I belong to thing one" end end thing1.makestuff # => prints: "I belong to thing one"