Home About Rice Downloads Documents Others Cooker CookerGX
Documents  >  Refernce  >  variable
Riceにおける変数

変数

メモリ領域に存在するデータを、インスタンスと呼ぶ。Riceにおける変数とは、インスタンスのアドレスに付けられた名前である。つまり、参照である。

型とは、インスタンスのデータに対する制限と、振舞の指定である。

宣言と定義と代入

変数は、宣言により名前の導入と型の拘束が行われ、定義により初期設定され、名前とアドレスの対応が代入により変更される。

変数の宣言、定義、代入は、フィッタ、セッタ、ゲッタ、メソッド定義内の任意の場所で行える。クラス定義内のそれ以外の場所で行われる変数の宣言は、フィールドの宣言である。フィールドは宣言と定義を同時に行うことはできない。

クラス定義の外で、変数の宣言、定義、代入を行うことは出来ない。つまり、大域変数はRiceには存在しない。

宣言

型名に名前が続いた文は、宣言文である。

例えば


int i;


これは、int型の i という名前の変数の宣言である。これ以降、この変数はint型のインスタンスのアドレスしか保持出来ない。

宣言文における型名は、ほとんどの場合、単純な型名の指定である。

例えば


int i;

string s;


ただし、コレクション型のlist,dictionary,queue,stackは内部に保持するタイプ名を指定することができる。

例えば


list{int} listInt;

stack{string} stackString;


上記のように宣言されたコレクション型の変数が指定されたタイプ以外の要素を保持することはできない。

内部に保持する要素の型は、任意の数を入れ子にすることができる。

例えば


list{dictionary{long}} ldl;

stack{queue{list{bool}}} sqlb;


定義

宣言に、代入記号と式が続いた文は定義文である。代入記号の右辺の式は適切な型のインスタンスを返す必要がある。

例えば


int i = 10;//intリテラルは、int型のインスタンスを返す。


上記は、int型の変数の定義である。

int型は仕様により、宣言で自動的に初期化されるので、必ずしも定義が必要なわけではない。ある型の変数に定義が必要かどうかは、型により異なる。

代入

変数への代入は、変数の参照するアドレスの変更である。

例えば


i = 10;//変数 i の参照を、intリテラルの返すインスタンスのアドレスに変更した。

j = i;//変数 j の参照を、i の参照に変更した。すなわち、i と j は、同じインスタンスを参照している。


スコープ

スコープとは、ある変数を使用可能な、ソースコードの範囲である。

クラス定義、フィッタ定義、セッタ定義、ゲッタ定義、メソッド定義は、それらに囲まれるコードに、スコープを生成する。if文、while文、fromto文、each文、try文も同様である。

スコープが他のスコープを囲む場合、内側のスコープは外側のスコープを見ることができるが、外側のスコープは、内側のスコープの内部にある変数を見ることはできない。

例えば


class sample

bool _flag;

open method void sample_method()

bool method_flag = _flag; //♦1

if(true)

bool if_flag = method_flag; //♦2

endif

bool method_flag2 = if_flag; //♦3

endmethod

endclass


♦1 : 参照可能。_falgはクラス定義の作成したスコープで宣言。内側(メソッド定義のスコープ)から外側は見える。

♦2 : 参照可能。method_flagはメソッド定義の作成したスコープで宣言。内側(if文のスコープ)から外側は見える。

♦3 : エラー。if_flagはif文の作成したスコープで宣言。外側から内側は見えない。

隠蔽

スコープが他のスコープを囲んで、同じ名前の変数が両方のスコープで宣言されている場合、内部で宣言された変数が、内部スコープで優先的に使用される。すなわち、内部で宣言された変数が、外部の同一名の変数を隠蔽する。

例えば


class sample

open method void sample_method()

bool flag = true;

if(true)

bool flag = false; //♦1

bool flag2 = flag; //♦2

endif

endmethod

endclass


♦1 : 同じ名前の変数を定義。

♦2 : if文内のflagが参照される。flag2の値はfalse。


ただし、内部スコープで同一名の変数を宣言するまでは、外部の変数が参照可能である。


class sample

open method void sample_method()

bool flag = true;

if(true)

bool flag2 = flag; //♦1

bool flag = false; //♦2

flag2 = flag; //♦3

endif

endmethod

endclass


♦1 : 外部のflagが参照される。flag2の値はtrue。

♦2 : ここから隠蔽される。

♦3 : if文内のflagが参照される。flag2の値はfalse。


更に、変数の定義文は右辺から評価されるので。


class sample

open method void sample_method()

bool flag = true;

if(true)

bool flag = flag; //♦1

endif

endmethod

endclass


♦1 : 定義文は右辺から評価される。内部のflagが外部のflagで初期化された。これ以降、隠蔽される。


変数が隠蔽された場合、隠蔽された変数を参照するための特別な記法は無い。必要に応じて隠蔽を避けるのは、プログラマの責任である。

他の隠蔽については、”識別子の隠蔽”を参照すること。

予約変数

Riceには、特定の文脈で自動的に定義される変数が存在する。これを、予約変数と呼ぶ。それらは自動的に定義される以外は、通常の変数と同じである。

以下に予約変数の一覧を示す。


while文の予約変数

__count

fromto文の予約変数

__count

__index

each文の予約変数

__count

__value

__key

try文の予約変数

__error


これらの変数名は、予約語では無いことに注意すること。特定の文脈以外では、変数名として宣言可能である。ただし、推奨はしない。

予約変数の詳細は、それぞれの文のマニュアルを参照すること。

Copyright © Rice All rights reserved.