変数名

C言語, C++

識別子として、半角英数字または _(アンダースコア)を使うことができる。半角数字を途中や最後に含めることはできるが、先頭で使うことはできない。

int, if などの予約されているキーワードは識別子として使えない。

マルチバイトの文字を使うことのできる実装もあるらしい。 \uHHHH の形式が使える、という規格もあるらしい。 $ を使うことのできる実装もあるらしい。これらは未確認。

大文字と小文字は区別される。大文字と小文字に文法上の違いはないが、慣例として、識別子の途中にある単語の先頭(キャメルケース)やクラス名の先頭などだけを大文字にして、その他を小文字にする。同じく慣例として、定数は全部大文字にする。

Java

識別子のルールは、C言語とよく似ているが、マルチバイトの文字も使うことができる点が違う。

識別子として、マルチバイトの文字を含めほとんどのUnicodeにある文字を使うことができる。記号は使えないが、$, (全角も), _, _(全角も) は使える。数字(半角でも全角でも)を途中や最後に含めることはできるが、先頭で使うことはできない。

Javaのライブラリに、文字がJavaの識別子として使うことができるかどうかをチェックする以下のメソッドがある。

Character#isJavaIdentifierStart
識別子の先頭として使えるかどうか。数字は false を返す。
Character#isJavaIdentifierPart
識別子の2文字目以降として使えるかどうか

int, if などの予約されているキーワードは識別子として使えない。

$ は使えるが、機械生成の識別子でよく使われるので、人間が書くコードには使わないほうがよい。よくある機械生成の識別子としては、内部クラス、無名クラスなどでJavaコンパイラが生成するものがある。Scalaのコンパイラもあらゆるところで $ を含む識別子を生成している。

大文字と小文字は区別される。大文字と小文字に文法上の違いはないが、慣例として、識別子の途中にある単語の先頭(キャメルケース)やクラス名の先頭などだけを大文字にして、その他を小文字にする。同じく慣例として、定数は全部大文字にする。

Scala

3つの形式が使える。

Javaと同じ形式

Javaと同じルールの識別子が使える。

$ も使えるが、Scalaのコンパイラが自動生成する内部の識別子でも大量に使われているので、使わないほうがよい。

_ という1文字の識別子も使えるが、無名関数の暗黙の引数として使われるので、普通は使わない。

大文字と小文字は区別される。大文字と小文字に文法上の違いはほとんどないが、 match式で扱いに違いがある。慣例として、識別子の途中にある単語の先頭(キャメルケース)やクラス名の先頭などだけを大文字にして、その他を小文字にする。同じく慣例として、定数は全部大文字にする。

演算子っぽい形式

演算子で使われるような記号だけで構成される識別子が使える。

Javaで演算子とされるものもScalaでは識別子としてその識別子が示すメソッドの呼び出しになる。新しい演算子っぽい名前のメソッドを定義することもできる。

バッククオートで囲んだ任意の形式

バッククオートで囲むことでバッククオート以外の任意の文字の識別子を作ることができる。数字だけの識別子も作れる。バッククオートがなくても上記2つの形式のいずれかの識別子として成立するものであれば、バッククオートがあるのとないのとで同じ識別子になる。つまり \%%%` という名前の変数を作ったら、 %%%` という表記でも参照できる。

以下のように予約語と同じ名前の識別子も使えるが、わかりにくいので、わざわざこのようなことはしない。

val `int` = "abc";

Thread#yield メソッドを呼び出したい場合、 yield がScalaの予約語なので、 Thread.yield() と書くことができず、Thread.\yield`()` と書くことになる。

PHP

変数名は先頭に $ を付け、2文字目にに半角英字またはアンダースコア(_)が続き、 3文字目以降は半角英数字またはアンダースコアを続けることができる。先頭の $ 以外はは0x7f-0xffも使えるので、日本語の変数名もできる。

変数名は大文字小文字を区別するが、関数名・クラス名は大文字小文字を区別しない。

定数名は先頭に $ が付かない点を除いて普通の変数名と同じルールだが、慣例では定数はすべて大文字で書く。

Python

C言語と同じく、識別子として、半角英数字または _(アンダースコア)を使うことができる。半角数字を途中や最後に含めることはできるが、先頭で使うことはできない。

大文字・小文字は区別される。

for, if, del などの予約されているキーワードは識別子として使えない。 int はキーワードではないが、デフォルトで関数名として存在するので、使わないほうがよい。

Ruby

$ で始まる変数は、グローバル変数。

@ で始まる変数は、インスタンス変数とよばれる、オブジェクトのフィールドを表す。 RubyではオブジェクトのフィールドはScalaでの protected[this] と同等で、フィールドアクセスはインスタンス自身のものにしかアクセスできず、従って obj.@field1 のような記法が存在しない。フィールドを外部に公開するには、attr_accessor, attr_reader などを使ってアクセッサメソッドを用意する必要がある。自分のインスタンスのフィールドにはアクセスできるので、スーパークラスで初期化されたフィールドにはアクセスできる。そのためJavaでのprivateよりはprotectedに近い。

@@ で始まる変数は、クラス変数と呼ばれる。C++の静的メンバー変数や Javaのstaticフィールドに近い。

アルファベット大文字で始まる名前は、定数である。慣例でそうするのではなく、 Rubyの文法により定数はアルファベット大文字で始まることになっている。

アルファベット小文字またはアンダースコア(_)で始まる変数は、ローカル変数。

Perl

$ で始まる変数は、配列やハッシュ以外のアトミックな値を保存する変数。配列やハッシュ、関数へのレファレンスも保存できるが、配列やハッシュ自体は保存できない。

@ で始まる変数は、配列を保存する変数。要素にアクセスするには $...[..] とする。

% で始まる変数は、ハッシュを保存する変数。要素にアクセスするには $...{..} とする。

$, @, % の3つはシジル(sigil)という。

このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。
スポンサーリンク