変数と定数
何らかの値に名前をつけるには、変数と定数を利用する方法があります。
変数
変数を扱うにはvar
とlet
を使います。
var
で宣言された変数はミュータブルであり、その後で代入によって値の変更が出来ます。
var x = 99
echo x #=> 99
x = 100
echo x #=> 100
let
で宣言された変数はイミュータブルであり、その後で値を変更することが出来ません。
let x = 99
x = 100 # コンパイルエラー
このコードをコンパイルしようとするとエラーになります。
Error: 'x' cannot be assigned to
代入しようとしているところで失敗しています。
定数
定数を扱うにはconst
を使います。
const THE_ANSWER = 42
const PI = 3.1415926535897
定数の値はコンパイル時に評価できる値でなければなりません。従って次はエラーになります。
let x = 1
const ONE = x # コンパイルエラー
コンパイルしようとするとエラーになります。
Error: cannot evaluate at compile time: x
当然、定数は値を後で変更することは出来ません。
var、let、constの使い分け
var
とlet
については、まずlet
を優先するべきです。値の変更が必要とされるのであればvar
を使います。
let
とconst
については、let
が変数であることと、const
がコンパイル時に決定されることを考慮して、適切な方を選択します。大まかな目安の一例としては、局所的な値を保持するものであればlet
、プログラムの各所に影響を及ぼすもので不変であるものはconst
とする使い分けが考えられます。let
はあくまで変数であり、const
は定数であることを考えれば、円周率のπなどはconst
の方が適切であると、なんとなく判断が出来ます。
いずれにしても絶対的なルールはありません。センスが問われるところでもあります。
変数、定数の型
Nimは静的型付けの言語であり、変数や定数は全て型を持ちます。上の例では型を明示していませんでした。これは型推論が働くためです。設定しようとしている値の型によって、コンパイラが自動で変数や定数の型を決定してくれます。多くの場合は、コードが簡潔になるので好ましいことです。しかし、型推論に頼らず、明示的に型を記述することも出来ます。
let x: int = 99
const PI: float = 3.1415926535897
上の例では特にメリットはありませんが、場合によっては、明示的に型を記述する方が意図が明らかになり、コードが読みやすくなる場合があります。
記述した型と値の型が一致しなければ、コンパイル時にエラーになります。
let x: int = 1.2
次のようなエラーメッセージが出力され、コンパイルに失敗します。
Error: type mismatch: got 'float64' for '1.2' but expected 'int'
浮動小数点数が自動的に整数に変換されることはありません。