変数

概要

  • 変数は、数値、文字列、クラスインスタンス、クラス型などの記憶場所です。
  • すべての変数には、初期値を代入することが可能です。
    • 初期値を設定しなかった場合、自動宣言された場合には、初期値としてnilが設定されます。

変数の種類

  • 変数は有効範囲の違いにより、ローカル変数、インスタンス変数、クラス変数の3種類が存在します。

ローカル変数

概要

  • 以下にあげる特定スコープ内でのみ有効な変数。
    • クラスメソッド、インスタンスメソッド
      • メソッド内の最初の参照時に自動で宣言されます。
    • パラメータ付きノード
      • パラメータ付きノードにパラメータとして与えられた変数はノード内でのみ有効です。
      • パラメータ付きノード内で初めて参照された変数はノード内でのみ有効です。
    • 例外ハンドラ
      • raiseに与えられた例外オブジェクトは、catch節の補足判定式、catch節でのみ有効です。
  • ローカル変数はスコープを抜けると消失します。
  • ローカル変数の名前は、識別子として有効な名称を自由につけることが可能です。
  • 明示的な宣言がなくても使用可能です(最初の参照時に自動宣言されます)

宣言、参照方法

  • ローカル変数の宣言、参照は以下のようになります。
    def method1()
      # メソッド内で有効なローカル変数
      a = 1  # a を宣言
    
      # 例外ハンドラ内で有効なローカル変数
      try
        raise 1
      catch |e|{e==0}  # eはcatch節内でのみ有効
        ...
      catch |e|{e==1}
        ...
      else
        ...
      end
      
      # パラメータ付きエクスプレッション内で有効なローカル変数
      # 式ノード内でのみ有効
      a = |x, y|{ x + y }
      a( 1, 2 )
    
      # パラメータ付きブロック内でのみ有効なローカル変数
      a = |x, y| block
        Console << x << "\n"
        Console << y << "\n"
        return x + y
      end
      a( 1, 2 )
    end
    
    a$ = 1 # [Error] 識別子として無効な名前
    Integer = 10 # Integer は定義済みクラスの静的インスタンスのため、ローカル変数として使用できません。
    

制約条件

  • ローカル変数には型制約、変化制約を付加することが可能です。
  • 型制約は、変数の型を制限するための制約です。
    • たとえば、ある変数の型を整数(Integer)や特定のクラス及びサブクラス等に制限することを可能にします。
  • 変化制約は、変数への再代入を禁止する制約です。
    val:int              # valを数値型として宣言します。初期値は0が代入されます。
    str="mkscript":final # strを、"mkscript" という値を持つ変更不可オブジェクトとして宣言します。
    text="program":final,string # 複数の制約を付加することもできます。
    f=1.0:MyClass        # [error]1.0は MyClassのインスタンスではないためエラーとなります。
    
    val = 10
    val:final # [error]最初の参照以降に、制約条件を追加変更することはできません。
    

インスタンス変数

概要

  • 特定オブジェクトのインスタンスに所属する変数。
  • class宣言内で明示的な宣言が必要です。
  • インスタンス変数の名前は、識別子として有効な名称を自由につけることが可能です。
  • オブジェクト変数.@インスタンス変数名、として参照できます。
    • インスタンスメソッド内で自オブジェクトのインスタンス変数を参照する場合、this.@インスタンス変数名 と記載します。
    • この場合の this. は省略可能です。

宣言、参照方法

  • インスタンス変数の宣言、参照は以下のようになります。
    class C1
      @val       # インスタンス変数valを宣言します
      @val2 = 10 # インスタンス変数val2を宣言し、初期値10を代入します。
    end
    

制約条件

  • インスタンス変数には型制約、変化制約、アクセス権限制約を付加することが可能です。
  • 型制約は、変数の型を制限するための制約です。
    • たとえば、ある変数の型を整数(Integer)に固定したり、class C1、及びサブクラスに制限することを可能にします。
  • 変化制約は、変数への再代入を禁止する制約です。
  • アクセス制限制約は read, write のそれぞれに対し、public, protected, private のアクセス制限をかけるための制約です。
  • デフォルトでは、read public, write protected が設定されます。
    class C1
      @val1 = 1 : read private, write private  # 読み取り、書き込みともにprivate宣言します。
      @val2 = 10: read protected, write public # 読み取りはprotected、書き込みはpublic宣言します。
      @val3 = 30: int, write public            # 読み取りはデフォルト(public)、書き込みはpublicで宣言します。
    end
    

クラス変数

概要

  • 特定オブジェクトの型に所属する変数。
  • class宣言内で明示的な宣言が必要です。
  • クラス変数の名前は、識別子として有効な名称を自由につけることが可能です。
  • クラス型名.@@インスタンス変数名、として参照できます。
    • クラスメソッド内から、同一クラスのクラス変数を参照する場合、クラス型名. は省略可能です。

宣言、参照方法

  • クラス変数の宣言、参照は以下のようになります。
    class C1
      @@val             # クラス変数 val を宣言します。
      @@val = 10        # クラス変数val2を宣言し、初期値10を代入します。
      class.@@val3 = 10 # クラス変数であることを明示することも可能です。
    end
    
  • Kernelクラスのクラス変数のみ宣言方法が異なります。
    • クラス定義の外部で以下のように記述します。
      class.@@value = 10 # Kernelクラスのクラス変数 value を宣言し、初期値10を代入します。
      

制約条件

  • インスタンス変数には型制約、変化制約、アクセス権限制約を付加することが可能です。
  • 型制約は、変数の型を制限するための制約です。
    • たとえば、ある変数の型を整数(Integer)に固定したり、class C1、及びサブクラスに制限することを可能にします。
  • 変化制約は、変数への再代入を禁止する制約です。
  • アクセス制限制約は read, write のそれぞれに対し、public, protected, private のアクセス制限をかけるための制約です。
  • デフォルトでは、read public, write protected が設定されます。