跳到内容

常量

常量可以在顶层或其他类型内部声明。 它们必须以大写字母开头

PI = 3.14

module Earth
  RADIUS = 6_371_000
end

PI            # => 3.14
Earth::RADIUS # => 6_371_000

虽然编译器不强制执行,但常量通常使用全大写字母和下划线来分隔单词。

常量定义可以调用方法并具有复杂的逻辑

TEN = begin
  a = 0
  while a < 10
    a += 1
  end
  a
end

TEN # => 10

伪常量

Crystal 提供了一些伪常量,它们提供有关正在执行的源代码的反射数据。

__LINE__ 是当前正在执行的 crystal 文件中的当前行号。 当 __LINE__ 用作默认参数值时,它表示方法调用位置处的行号。

__END_LINE__ 是调用块的 end 的行号。 只能用作默认参数值。

__FILE__ 引用当前正在执行的 crystal 文件的完整路径。

__DIR__ 引用当前正在执行的 crystal 文件所在的目录的完整路径。

# Assuming this example code is saved at: /crystal_code/pseudo_constants.cr
#
def pseudo_constants(caller_line = __LINE__, end_of_caller = __END_LINE__)
  puts "Called from line number: #{caller_line}"
  puts "Currently at line number: #{__LINE__}"
  puts "End of caller block is at: #{end_of_caller}"
  puts "File path is: #{__FILE__}"
  puts "Directory file is in: #{__DIR__}"
end

begin
  pseudo_constants
end

# Program prints:
# Called from line number: 13
# Currently at line number: 5
# End of caller block is at: 14
# File path is: /crystal_code/pseudo_constants.cr
# Directory file is in: /crystal_code

动态赋值

使用 链式赋值多重赋值 动态地为常量赋值不受支持,会导致语法错误。

ONE, TWO, THREE = 1, 2, 3 # Syntax error: Multiple assignment is not allowed for constants