类方法¶
类方法是与类或模块关联的方法,而不是与特定实例关联的方法。
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
的构造函数,但它们也可以定义其他名称不同的构造函数。