常量¶
常量可以在顶层或其他类型内部声明。 它们必须以大写字母开头
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