let(ローカル変数)
let はトークの中だけで使えるローカル変数です。
宣言したブロック({ })を出るか、トークの実行が終わると消えます。
let はトークや関数の外(ファイルのトップレベル)には書けません。書くと「let はトークや関数の中でしか使えません」というエラーになります。
複数のトークで同じ値を使いたいときは、トップレベルに global を書いてください。
global 一覧 = {"ふれいむ": ["フレイム", "炎を放つ魔法。"]}
OnBoot => {
湊: ${一覧["ふれいむ"][0]}
}
基本的な書き方
OnBoot => {
let name = "湊"
湊: 私の名前は${name}です。
}
値の種類
数値・文字列・bool・配列・マップが使えます。
OnBoot => {
let count = 0
let name = "湊"
let flag = true
let items = ["あ", "い", "う"]
let data = {"key": "value"}
}
計算
OnBoot => {
let a = 10
let b = 3
let sum = a + b
湊: ${a}と${b}を足すと${sum}です。
}
再代入
let で宣言した変数は後から値を変えられます。
OnBoot => {
let count = 0
count += 1
count += 1
湊: ${count}回カウントしました。
}
添字を使った代入
配列やマップの要素は、添字を使って書き換えられます。添字には変数や式も書けます。
OnBoot => {
let map = [[0, 0, 0], [0, 0, 0]]
let y = 1
let x = 2
map[y][x] = 1
map[y - 1][x] += 5
湊: ${map[1][2]} ${map[0][2]}
}
出力は 1 5 になります。
- 配列の範囲外(長さ以上、
-1、1.5など)の添字への代入は無視され、「配列の添字 N は範囲外です(長さ M)」という warning が出ます。配列は代入では伸びません。 - 未定義の変数への添字代入は、配列ではなくマップになります。
m[y][x] = 1と書くと、mは{"1": {"2": 1}}というマップになります。配列として使いたいときは、先にlet m = [[0, 0, 0], [0, 0, 0]]のように初期化してください。
let の有効範囲
let の変数は、宣言したブロック({ })の中だけで有効です。
if、for、foreach、while、match の中で let すると、そのブロックを出たときに消えます。
一方、let なしの代入(c = 5)は、外側に同名のローカル変数があれば、その変数を更新します。
OnBoot => {
let a = 1
let c = 1
if (true) {
let a = 2
c = 5
let b = 3
}
湊: a=${a} b=${b} c=${c}
}
出力は a=1 b= c=5 になります。
let a = 2は、ifの中に新しいaを作ります。外のaは 1 のままです。c = 5は、外のcを更新します。bはifの中で消えるので、外では空です。
let なしの代入は「起動中グローバル」になる
let を付けずに x = 5 と書いたとき、その名前のローカル変数がなければ、起動中だけ有効なグローバル変数が作られます。
他のトークからも見えますが、save.json には保存されず、ゴーストを終了すると消えます。
OnBoot => {
counter = 5
}
OnClose => {
湊: counter=${counter}
}
OnBoot で作った counter が、別のトーク OnClose から見えます。
トークの中だけで使う一時的な値は、名前がぶつかって他のトークに影響しないよう、必ず let で宣言してください。
起動中だけ共有したい値は global work.x = 1 のように書きます(名前が work で始まる、というだけの約束です)。
再起動後も残したい値は global save.x に置きます(global / save(永続化))。
これらの違いは、里々やYAYAから移る場合に特に問題になります。詳しくは5. 変数を参照してください。