Rubyの定数のお話

今回はRubyの定数のお話。

Rubyにも定数があります。がやはりいろいろと細かく他の言語とは違うところもあります。
今回はそこについて。

Rubyで定数を宣言するには先頭が大文字であること。あとは構成文字に英数字、_が使えます。
定数の参照はレキシカルに決定されます。

で、定数なんですがRubyでは再度代入ができます。警告はでるけど。
定数のクセに代入できるのかよ、と思うがRubyから入ったらそうは思うこともないのだろうか。

以下のようにするとスコープが異なるので警告は出ません

クラス内での定義は

継承した場合はこう。

これはわかるがではこうするとどうなるか

BをnewしているのでBで宣言しているNAMEがよばれるだろ。と思ってたら
結果は”A”になります。
これは定数がインスタンスではなくクラスに存在するためです。
なのでnameを呼び出したクラス内定数であるNAME=”A”が呼ばれます。
よってclass AのNAME定数がない場合は”`name’: uninitialized constant A::NAME (NameError)”が呼ばれます。Bは呼ばれません

定数でない場合、ローカル変数、インスタンス変数の場合は動きが異なります。

さらにクラスの中にクラスの場合は

どうなるか?
Rubyの定数は使われている定数の場所がネストされている場合は内側から順に定数の探索されます。
上の例だだとCbクラス内でCONSTの定数はない(レキシカルスコープに定数がない場合)はスーパークラスの探索を行います。
じゃあCaが呼ばれるのかというとCbから最も近いものとして”C”が呼ばれます。この辺りが良く混乱する。

Caのほうを呼びたいんだよ!という場合はCa::CONSTで明示的にすればOK。というかこうしておいたほうがわかりやすい。
ちなみに一応CクラスにあるCONST=”C”がない場合はスーパークラスであるCaのほうのCONSTが呼ばれます。

今回はRubyの定数のお話でした。

About the author

naito06

C++やったり、PythonやったりPHPだったり。

Add Comment

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

By naito06

最近の投稿

アーカイブ

カテゴリー

タグクラウド

コーポレートサイト

メタ情報