💎

【Crystalと○○】 Crystalと識別子

2021/04/19に公開

📖【Crystalと○○】コンテンツ一覧

変数名や定数名、メソッド名などで使用可能な識別子の扱いについて詳しく見てみましょう。

識別子のフォーマット

Crystalにおける識別子の定義は以下のようなものです。

  1. 先頭は半角アルファベット(azAz)、半角アンダースコア(_)、UTF-8マルチバイト文字
  2. その後に半角アルファベット、半角アンダースコア、マルチバイト文字、半角数字(09)が続く
  3. 予約語(キーワード)や特殊な変数名と被らない

ですので、次の例は有効な識別子になります。

local_var # よく見かけるパターン
CONST     # 大文字
_var_     # アンダースコアで開始、終了
__var     # 連続したアンダースコア

逆に、次のような例は識別子とはみなされません。

1st_name  # 数字で始まる
cats&dogs # アンダースコア以外の半角記号を含む
if        # 予約語と被る
__FILE__  # 特殊な変数名と被る

では、具体的な識別子の利用シーンを見てみましょう。

ローカル変数 / メソッド

大文字以外で始まる識別子は、ローカル変数やメソッド名で利用できます。
大文字以外で始まれば良いのでアンダースコーアで始まるローカル変数やメソッドを利用することもできます。また、先頭出なければ大文字を含むことも可能ですが、Crystalでは一般的にローカル変数やメソッド名は小文字を使用したスネークケースを使用する場合がほとんどです。

例: local_varmethod_name

定数 /

大文字で始まる識別子は定数や型の名前で利用できます。
定数名と型名には構文上の区別はありませんが、慣例的に定数名は全て大文字のスネークケース、型名はキャメルケースを使用する場合がほとんどです。

例: CONST_NAMETypeName

インスタンス変数

@ ひとつに続く識別子はインスタンス変数名です。
構文上は大文字も小文字も使えますが、慣例的に @ の後ろはローカル変数と同じ形式を使用します。

例: @instance_var

クラス変数

@@ に続く識別子はクラス変数名です。
構文上は大文字も小文字も使えますが、慣例的に @@ の後ろはローカル変数と同じ形式を使用します。

例: @class_var

余談:変わり種識別子

UTF8マルチバイト文字が利用可能なため、日本語や絵文字が変数名に使えたりします。

umai.cr
def 飲み食い(🍴)
  puts "#{🍴}ウマー!!"
end

🍺 = "ビール"
飲み食い(🍺)

🍣 = "寿司"
飲み食い(🍣)
$ crystal run umai.cr
ビールウマー!!
寿司ウマー!!

今回のまとめ

  • 識別子のルールは意外とシンプル
  • 先頭文字や、前に@@@が付くかどうかで利用シーンが決まる
  • UTF8文字を駆使してネタ的に変な記述は可能

Discussion