好き勝手に・げーあにん?

ファミコンと同い年の社会人ヌルオタの日記

Squirrel でのリロードどうしてる?

Lua とか Squirrel を使ってる人に会ったら聞きたいことをメモ。

Squirrel
* リロードどうしてる?

Lua と Squirrel で気になっていることメモ - 好き勝手に・げーあにん?

自分自身の昨日のメモなんだけど、とりあえず私の現状を書いとく。といっても、素直に対象の class と、その instance を全部作り直してるだけだけど。

class Class {
  function a() {print("a\n")}
}

local x = Class()
x.a()

// ここリロードのかわり
delete Class
class Class {
  function a() {print("AAA\n")}
}

print("roottableから消えただけで、まだ生きている\n")
x.a()

print("新しく作った方を使うためにインスタンス作り直し\n")
x = Class()
x.a()

a
roottableから消えただけで、まだ生きている
a
新しく作った方を使うためにインスタンス作り直し
AAA

  1. delete class
  2. 同名の新しい class を定義
  3. instance を全部作り直し

とりあえず、一番簡単な方法はこれだよなぁ。インスタンス全部作り直さないといけないのがバカっぽいけど、Squirrel の class はインスタンス作っちゃうと変更できなくなるからなぁ。

インスタンスを生かしたまま関数だけリロードしようとすると、こんな感じ?

// 関数だけ別のインスタンスに持たせとく
ClassPrototype <- class {
  function a() {print(num+"\n")}
}()

class Class {
  constructor(n) {num = n}
  num = 0
  // ClassPrototype のメソッドを使う
  function a() {ClassPrototype.a.call(this)}
}

local x = Class(1)
local y = Class(2)
x.a()
y.a()

// ここリロードのかわり
ClassPrototype = class {
  function a() {print(num*10+"\n")}
}()

x.a()
y.a()

1
2
10
20

これはこれでいいような気もしないでもないけど、もうちょっとなんとかならないものか。

今のところは class 単位で全部作り直しで、あんまり困ってなかったりするんだよな。困ってきたらまた考える?