コンテンツにスキップ

スコープと定義

スコープと、変数/定数/関数/クラスの定義について解説します。

スコープ

定義された場所によって、以下のスコープを得ます。

  • グローバルスコープ:ファイルのトップレベルのスコープ。変数/定数/関数/クラスの定義が可能。
  • クラススコープ:クラスの中で関数の外のスコープ。変数/定数/関数が定義可能。
  • ローカルスコープ:関数の中のスコープ。変数/定数が定義可能。
// グローバルスコープの変数
int globalInt = 100;

// グローバルスコープの関数
void GlobalFunc() {

    // ローカルスコープの変数
    string name = "";
}

// グローバルスコープのクラス
class MyClass {

    // クラススコープの変数
    string secretID;

    // クラススコープの関数
    public string GetName(){}
}

変数

グローバル変数

グローバルスコープで変数を宣言すると、そのソースファイルの中と、アプリ全体で利用できるグローバル変数を宣言できます。
基本型クラス のどちらの型もグローバル変数として宣言できますが、クラス に関しては宣言と同時に初期化することができません。

// 基本型は宣言と同時に初期化が可能
int value = 100;

// クラスは宣言のみ可能
MyClass myClass;

インスタンス変数

クラススコープで宣言された変数を、インスタンス変数といいます。
インスタンス変数は、そのクラスのインスタンスごとに個別のデータを持ちます。
基本型クラス のどちらの型もインスタンス変数として宣言できます。

class MyClass {
    // 基本型のインスタンス変数
    int value;

    // クラスのインスタンス変数
    OtherClass otherClass;
}

ローカル変数

ローカルスコープで「型名 変数名」と宣言することで、そのスコープの中でのみ利用可能なローカル変数を宣言できます。 ローカル変数は宣言と同時に初期化することもできます。

void TestFunc() {
    // 初期値の割り当ては任意
    string emptyText;
    int value = 100;
}

定数

同時に宣言と初期化された変数の前に const を付与することで、その変数は定数となり変更できなくなります。
定数にできる型は、基本型int, float, bool, string となります。
グローバル、クラス、ローカルの全スコープで、定数を定義できます。

// int型の定数を定義
const int immutable = 999;

クラススコープでは定数のみ初期化できます

定数はクラススコープで宣言と初期化が可能です。
変数はクラススコープで宣言可能ですが、ここで初期化することはできません。

class MyClass {
    // 定数の宣言と初期化
    const int value = 999;

    // NG例: 変数はここで初期化できません
    // int value2 = 999;

    // 変数は宣言のみ可能
    int value2;
}

関数

「戻り値 関数名(引数1, 引数2, ...)」という形で、関数を定義できます。戻り値を返さない関数を定義するには、void を指定します。

int Add(int x, int y) {
    return x + y;
}

string CreateName(string firstName, string lastName) {
    string name = firstName + " " + lastName;
    return name;
}

void LogOutput(string log) {
    hsSystemOutput(log);
}

クラス

class の後にクラス名を、その後に { } で囲んだコードを記述することで、構造を持った型であるクラスを定義できます。

クラス定義の中に、クラス名と同じ名前の関数を public で定義すると、それはコンストラクタになります。
クラスのインスタンスを生成する際には、new 演算子の後にクラスのコンストラクタを呼び出してください。

// クラスの定義
class MyAvatar {

    // コンストラクタ
    public MyAvatar() {}
}

void main() {
    // クラスのインスタンスを生成
    MyAvatar avatar = new MyAvatar();
}

クラスのインスタンス変数に外部からアクセスする方法

クラススコープの変数や定数にpublicを付与することで、外部からアクセス可能になります。

class MyAvatar {
    public string name;
    const int age = 20;
}

void main() {
    MyAvatar avatar = new MyAvatar();

    // nameにpublicが付与されているのでアクセス可能
    avatar.name = "my name";

    int age;

    // ageは公開設定されていないので、アクセスするとコンパイルエラーになる
    // age = avatar.age;
}

現時点で、HeliScriptは引数を持つコンストラクタに対応していません。

引数を持つコンストラクタに対応していないため、通常のメソッドでデータを渡してください。