类方法类型

类有 3 种类型的方法:实例,单例和类方法。

实例方法

这些是可以从类的 instance 调用的方法。

class Thing
  def somemethod
    puts "something"
  end
end

foo = Thing.new # create an instance of the class
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!"

单例方法

这些仅适用于该类的特定实例,但不适用于所有类。

# create an empty class
class Thing
end

# two instances of the class
thing1 = Thing.new
thing2 = Thing.new

# create a singleton method
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>

singletonclass 方法都称为 eigenclasses。基本上,ruby 所做的是创建一个包含这些方法的匿名类,以便它不会干扰创建的实例。

另一种方法是使用 class << 构造函数。例如:

# a class method (same as the above example)
class Thing
  class << self # the anonymous class
    def hello(name)
      puts "Hello, #{name}!"
    end
  end
end

Thing.hello("sarah") # => Hello, sarah!

# singleton method

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"