Ruby类方法类型

示例

类具有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"