類方法型別

類有 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"