Crystalは、コンパイル型のオブジェクト指向プログラミング言語です。 この言語の目標には、次のようなものがあります。
Rubyにインスパイアされた構文。
静的な型チェックを行いますが、変数やメソッドの引数の型を明示する必要はありません。
Crystalでバインディングを書くことで、Cのコードを呼び出せるようにすること。
定型的なコードを避けるために、コンパイル時の評価とコード生成を行うこと。
効率的なネイティブコードにコンパイルすること。
Crystalの開発は、Rubyのエレガンスさと生産性を持ちながら、コンパイル言語の性能と型安全性をあわせ持つ言語を作るという目標のもと、2011年に始まりました。 言語のコンパイラーは当初Rubyで書かれていましたが、2013年にCrystalで書き直されました。 Ary Borenszweig、Juan Wajnerman、Brian Cardiffが、この言語を開発し設計しました。
変数を宣言するには、代入演算子の=を使います。
Crystalでは、変数にはsnake_case形式を使います。
number = 1
puts number # => 1
number = 2
puts number # => 2
定数も同じ=の代入演算子で宣言しますが、SCREAMING_SNAKE_CASEと呼ばれる、すべて大文字の名前を使います。
NUMBER = 1
puts NUMBER # => 1
すでに定義された定数に値を代入すると、コンパイル時のエラーになります。
NUMBER = 1
NUMBER = 2
# Error: already initialized constant NUMBER
Crystalはコンパイル言語なので、すべての変数やメソッドの引数には、コンパイル時に型が割り当てられます。 コンパイラーは、変数やメソッドの引数の型を推論できます。 ただし、場合によっては型を明示する必要があります。 型の指定が必要になるケースについては、あとの概念で説明します。
メソッドは、再利用できる一連の命令をまとめる方法です。
Crystalでは、メソッドはクラスやモジュール、構造体の中で定義することが多いです。
ただし、メソッドはクラスやモジュール、構造体の外側でも定義できます。
メソッドは、defキーワードに続けてメソッド名を書いて宣言します。
Crystalでは、メソッドはsnake_caseで書きます。
メソッドに引数がない場合は、括弧(())を省略できます。
メソッドの終わりを宣言するには、endキーワードを使います。
def hello
puts "Hello World!"
end
変数やメソッドの引数の型に存在しないメソッドを使うと、コンパイル時のエラーになります。
number = 1
number + "1"
# Error: no overload matches 'Int32#+' with type String
メソッドには引数を渡せます。 引数は、メソッドに渡されるデータです。 メソッドに引数を渡せるようにするには、引数の名前を指定します。 Crystalでは、引数はsnake_caseで書きます。 メソッドは複数の引数を持てますが、引数はカンマで区切ります。
def hello(name)
puts "Hello #{name}!"
end
メソッドは複数の引数を持つこともできます。 この場合、引数はカンマで区切る必要があります。
def hello(name, language)
puts "Hello #{name}! You are learning #{language}."
end
クラスやモジュール、構造体に属するメソッドを呼び出すときは、ドット演算子(.)を使います。
形式は<ClassName>.<method_name>です。
メソッドがクラスやモジュール、構造体に属していない場合は、名前を書くだけで呼び出せます。
メソッドは常に、最後の式の値を暗黙的に返します。
メソッドに引数がある場合は、次のように、メソッドの呼び出しと定義で引数を指定するときに括弧を使えます:<method_name>(<argument_1>, <argument_2>, ...)。
メソッドに引数がない場合は、括弧は省略します。
def hello(name)
"Hello #{name}!"
end
hello("Crystal")
# => Hello Crystal!
複数の引数を持つメソッドを呼び出すときは、引数をカンマで区切ります。 引数は、メソッドの引数と同じ順番で渡す必要があります。
def hello_language(name, language)
"Hello #{name}! You are learning #{language}."
end
hello_language("World", "Crystal")
# => Hello World! You are learning Crystal.
引数の数が間違っているメソッドを呼び出すと、コンパイル時のエラーになります。
hello_language("Crystal")
# wrong number of arguments for 'hello_language' (given 1, expected 2)
Crystalでは、+演算子を使って2つの数値を足せます。
-演算子を使えば、2つの数値を引くこともできます。
また、*演算子を使えば、2つの数値を掛けられます。
1 + 1
# => 2
2 - 1
# => 1
2 * 2
# => 4
Crystalでは、コメントは#の文字に続けてスペースを書き、そのあとにコメントを書きます。
コメントは、コードを説明するために使います。
コンパイラーはコメントを実行しません。
# This is a comment