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 |