跳到內容

類別方法

類別方法是與類別或模組相關聯的方法,而不是與特定的實例相關聯。

module CaesarCipher
  def self.encrypt(string : String)
    string.chars.map { |char| ((char.upcase.ord - 52) % 26 + 65).chr }.join
  end
end

CaesarCipher.encrypt("HELLO") # => "URYYB"

類別方法透過在方法名稱前面加上型別名稱和一個句點來定義。

def CaesarCipher.decrypt(string : String)
  encrypt(string)
end

當它們在類別或模組範圍內定義時,使用 self 而不是類別名稱會更容易。

類別方法也可以透過擴展一個 Module來定義。

類別方法可以使用與定義時相同的名稱來呼叫 (CaesarCipher.decrypt("HELLO"))。當從相同的類別或模組範圍內呼叫時,接收者可以是 self 或隱式 (如 encrypt(string))。

類別方法不在類別的實例範圍內;相反的,要透過類別範圍來存取它。

class Foo
  def self.shout(str : String)
    puts str.upcase
  end

  def baz
    self.class.shout("baz")
  end
end

Foo.new.baz # => BAZ

建構子

建構子是普通的類別方法,用於建立類別的新實例。預設情況下,Crystal 中的所有類別都至少有一個名為 new 的建構子,但它們也可能定義其他名稱不同的建構子。