Константы
Константы можно объявлять на верхнем уровне или внутри других типов. Они должны начинаться с заглавной буквы:
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
To the extent possible under law, the persons who contributed to this workhave waived
all copyright and related or neighboring rights to this workby associating CC0 with it.
https://crystal-lang.org/reference/1.2/syntax_and_semantics/constants.html