コンテンツへスキップ

定数

定数はトップレベルまたは他の型の中で宣言できます。それらは大文字で始まる必要があります。

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