/Crystal 0.31


Constants can be declared at the top level or inside other types. They must start with a capital letter:

PI = 3.14

module Earth
  RADIUS = 6_371_000

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

Although not enforced by the compiler, constants are usually named with all capital letters and underscores to separate words.

A constant definition can invoke methods and have complex logic:

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

TEN #=> 10

Pseudo Constants

Crystal provides a few pseudo-constants which provide reflective data about the source code being executed.

__LINE__ is the current line number in the currently executing crystal file. When __LINE__ is declared as the default value to a method parameter, it represents the line number at the location of the method call.

__END_LINE__ is the line number of the end of the calling block. Can only be used as a default value to a method parameter.

__FILE__ references the full path to the currently executing crystal file.

__DIR__ references the full path to the directory where the currently executing crystal file is located.

# 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__}"


# 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

Dynamic assignment

Dynamically assigning values to constants using the chained assignment or the multiple assignment is not supported and results in a syntax error.

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.