Specript Language Reference rev.0.7.0 www.specript.org

目次 | << 前章 | 次章 >>

5.property

propertyとはSpecriptにおけるデータです。property定義により、具体的なデータの値と、 その値を参照するための値に対する識別子を定めます。

5−1.property定義

property定義とは、なんらかのデータを定義するものです。定義したpropertyは 所属namespace内および系列下位のnamespaceより、あるいはpublic修飾子が付いていれば 他namespaceから参照することができます。

【property定義の書式(EBNF)】

<property定義> ::=

( "public" | "private" )? "property" <property名> ( ":" ( "not" "null" )? <propertyのspec> )? "=" <初期化式> ( "#" <制約違反式> )? ";"

【記述例】
  • spec指定あり
  •     property 消費税率:decimal = 0.05;
    
        property レンタル可能日数表:map<string, list<integer>> = [
            "一般" => [1, 7],
            "新作" => [1, 2, 3, 7]
        ];
        
  • spec指定なし
  •     property 消費税率 = 0.05;
    
        property レンタル可能日数表 = [
            "一般" => [1, 7],
            "新作" => [1, 2, 3, 7]
        ];
        

    property定義の"="の右辺には、そのpropertyの値を表す任意の初期化式を 記述します。propertyの初期化式には

    integerリテラル、stringリテラル等のリテラル、
    record生成式、list生成式、map生成式など、
    その他任意の式、
    を記述できます。

    式の詳細については第8章をご参照ください。
    【例】
  • リテラル
  •     // decimalリテラルの例
        property 消費税率:decimal = 0.05;
    
        // stringリテラルの例
        property title:string = "The Specript Language";
        
  • record生成式、list生成式、map生成式
  •     // 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)です。

    第3章も参照してください。

    5−2.propertyのspec

    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の互換性評価の詳細について第7章第3節を参照してください。

    一方、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]
        ];
        

    5−3.not null指定

    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違反」が発生します。

    「not null違反」発生時の振る舞いについて第10章第2節を 参照してください。

    目次 | << 前章 | 次章 >>


    (c)2007-2008, Specript Development Team Last Updated: 2008-03-06