問題タブ [upvalue]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
lua - 「upvalue をインデックスしようとする」の意味は何ですか
Lua でプログラミングの最初のステップを踏んでいますが、スクリプトを実行すると次のエラーが発生します。
おそらく、まだ把握していない非常に基本的なことが原因ですが、グーグルで調べても良い情報が見つかりません。誰かが私にそれが何を意味するのか説明してもらえますか?
lua - 共有アップバリューとは何ですか?
2 つのクロージャがアップバリューをどのように共有するのか? そして、それはどのように機能しますか?
print_env()
それから呼び出すと、定義された in がfoo()
出力されますが、それらは異なる関数であるため、クロージャの上位値が異なるべきではありませんか? したがって、一方の関数がその上位値を変更しても、もう一方は同じままです。それとも特別なアップバリューですか?_ENV
foo()
_ENV
ありがとう
lua - ローカル変数の値の変更/更新 (Lua の upvalue)
require
すでに編集されているモジュールをホットリロードするスクリプトを作成しました。部分的にしか機能しませんが...
このタスクに対する私のアプローチは非常に単純です。Lua のrequire
関数を変更して、ロードしたモジュールをタイムスタンプとそのファイル パスと共に記憶するようにしました。次に、シェル スクリプトを使用してこれらのファイルの変更時刻を監視し、変更された場合はそれらを再要求します。dofile()
エラーが発生しない場合は、戻り値を取得して (再) 割り当てますpackage.loaded[<module>]
。ここまでは順調ですね。
などのグローバル変数を使用すると、これらすべてが完全に機能しますfoo = require "foobar"
が、 のようなローカル割り当てを使用するlocal foo = require "foobar"
と、ホットスワッパーが (部分的に) 失敗します。
パッケージは意図したとおりにスワップ アウトされているようですが、ローカル変数 (上記の割り当てによる) は古い参照または require が初めて呼び出されたときに取得した古い値を保持しています。
私のアイデアは、Luadebug.getlocal
とdebug.setlocal
関数を使用してすべてのローカル変数 (スタック内の上位値) を見つけ、それらの値/参照を更新することでした。
しかし、変更したい上限値が「範囲外」であるというエラーが表示されます...誰か助けてくれませんか? どうすればよいですか、またはこれを回避するにはどうすればよいですか?
完全なコードは Gistにありますが、重要/関連するスニペットは...
local_upvalues()
利用可能なすべての上位値を収集する 27 行目の関数
- 行 89 では、
debug.setlocal()
廃止されたモジュール参照を保持する upvalue を更新しようとしています。