クラスメソッド¶
クラスメソッドは、特定のインスタンスではなく、クラスまたはモジュールに関連付けられたメソッドです。
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` と呼ばれるコンストラクタが 1 つありますが、異なる名前のコンストラクタを定義することもできます。