| Specript Language Reference rev.0.7.0 | www.specript.org |
propertyとはSpecriptにおけるデータです。property定義により、具体的なデータの値と、 その値を参照するための値に対する識別子を定めます。
property定義とは、なんらかのデータを定義するものです。定義したpropertyは 所属namespace内および系列下位のnamespaceより、あるいはpublic修飾子が付いていれば 他namespaceから参照することができます。
public" | "private" )?
"property"
<property名>
( ":" ( "not" "null" )? <propertyのspec> )?
"=" <初期化式>
( "#" <制約違反式> )?
";"
property 消費税率:decimal = 0.05;
property レンタル可能日数表:map<string, list<integer>> = [
"一般" => [1, 7],
"新作" => [1, 2, 3, 7]
];
property 消費税率 = 0.05;
property レンタル可能日数表 = [
"一般" => [1, 7],
"新作" => [1, 2, 3, 7]
];
property定義の"="の右辺には、そのpropertyの値を表す任意の初期化式を
記述します。propertyの初期化式には
// decimalリテラルの例
property 消費税率:decimal = 0.05;
// stringリテラルの例
property title:string = "The Specript Language";
// list生成式の例
property cars:list<string> = ["Lancer", "Legend", "Orochi"];
// "商品情報仕様"はrecord派生のspec、list生成式とrecord生成式の組み合わせの例
property 商品リスト:list<商品情報仕様> = [
{
商品コード = "10001",
タイトル = "博士の愛した数式",
商品区分 = "一般"
},
{
商品コード = "10002",
タイトル = "男たちの大和",
商品区分 = "一般"
},
{
商品コード = "10003",
タイトル = "DEATH NOTE the Last name",
商品区分 = "新作"
}
];
// 任意の演算
property 1日の秒数:integer = 60 * 60 * 24;
// 他のpropertyを参照しつつ演算
property a:integer = 3;
property b:integer = a + 2;
定義されたpropertyは常に全て‘immutable’です。一度定義したpropertyは後に値を 変更することはできません。(Specriptには値を変更するような構文が存在しません。) propertyに値を設定することができるのは、定義時の初期化式によってのみです。
また、Specriptのタイプに参照タイプはありません。property定義されたデータも常に 値扱い(by-value)です。
property定義時に、property名の右に":"で区切ってspecを指定することが
できます。specが指定された場合は、初期化式の評価結果が指定されたspecと‘互換性’がない
とき、コンパイル時エラーまたは実行時エラーとなります。
// これはOKです。
property p:decimal = 0.05;
// これはコンパイル時エラーとなります。
property q:integer = 0.05; // コンパイル時エラー
// ちなみにこれはOKです。integerである"10"は暗黙にdecimalにキャストされます。
property r:decimal = 10;
// 式の評価結果がpropertyのspecに合致するのでOKです。
property s:integer = "abc".length + 4;
// listのタイプアーギュメントが異なるのでコンパイル時エラーです。
property t:list<integer> = ["Lancer", "Legend", "Orochi"]; // コンパイル時エラー
一方、spec指定を省略することも可能です。その場合、propertyのspecは、簡単な型推論により、 逆に初期化式の評価結果が表すspecであるとされます。
// propertyのspecは暗黙にdecimalであるとされます。
property p = 0.05;
// propertyのspecは暗黙にintegerであるとされます。
property q = 10;
// propertyのspecは暗黙にintegerであるとされます。
property r = "abc".length + 4;
// propertyのspecは暗黙にlist<string>であるとされます。
property s = ["Lancer", "Legend", "Orochi"];
// propertyのspecは暗黙にmap<string, list<integer>>であるとされます。
property レンタル可能日数表 = [
"一般" => [1, 7],
"新作" => [1, 2, 3, 7]
];
property定義においてspecを指定することができますが、合わせて、not null指定を
行うことができます。
// not null指定の無いproperty定義です。
property a_code:string = "90004";
// not null指定の有るproperty定義です。
property a_code:not null string = "90004";
not null指定がある場合、初期化式の評価値がnullになったとき、
実行時に「not null違反」が発生します。
| (c)2007-2008, Specript Development Team | Last Updated: 2008-03-06 |