コンテンツにスキップ

クラスメソッド

クラスメソッドは、特定のインスタンスではなく、クラスまたはモジュールに関連付けられたメソッドです。

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 つありますが、異なる名前のコンストラクタを定義することもできます。