類別方法¶
類別方法是與類別或模組相關聯的方法,而不是與特定的實例相關聯。
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
的建構子,但它們也可能定義其他名稱不同的建構子。