跳至内容

类方法

类方法是与类或模块关联的方法,而不是与特定实例关联的方法。

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 的构造函数,但它们也可以定义其他名称不同的构造函数。