問題タブ [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.

0 投票する
2 に答える
30119 参照

lua - 「upvalue をインデックスしようとする」の意味は何ですか

Lua でプログラミングの最初のステップを踏んでいますが、スクリプトを実行すると次のエラーが発生します。

おそらく、まだ把握していない非常に基本的なことが原因ですが、グーグルで調べても良い情報が見つかりません。誰かが私にそれが何を意味するのか説明してもらえますか?

0 投票する
1 に答える
549 参照

lua - 共有アップバリューとは何ですか?

2 つのクロージャがアップバリューをどのように共有するのか? そして、それはどのように機能しますか?

print_env()それから呼び出すと、定義された in がfoo()出力されますが、それらは異なる関数であるため、クロージャの上位値が異なるべきではありませんか? したがって、一方の関数がその上位値を変更しても、もう一方は同じままです。それとも特別なアップバリューですか?_ENVfoo()_ENV

ありがとう

0 投票する
2 に答える
2730 参照

lua - ローカル変数の値の変更/更新 (Lua の upvalue)

requireすでに編集されているモジュールをホットリロードするスクリプトを作成しました。部分的にしか機能しませんが...

このタスクに対する私のアプローチは非常に単純です。Lua のrequire関数を変更して、ロードしたモジュールをタイムスタンプとそのファイル パスと共に記憶するようにしました。次に、シェル スクリプトを使用してこれらのファイルの変更時刻を監視し、変更された場合はそれらを再要求します。dofile()エラーが発生しない場合は、戻り値を取得して (再) 割り当てますpackage.loaded[<module>]。ここまでは順調ですね。

などのグローバル変数を使用すると、これらすべてが完全に機能しますfoo = require "foobar"が、 のようなローカル割り当てを使用するlocal foo = require "foobar"と、ホットスワッパーが (部分的に) 失敗します。

パッケージは意図したとおりにスワップ アウトされているようですが、ローカル変数 (上記の割り当てによる) は古い参照または require が初めて呼び出されたときに取得した古い値を保持しています。

私のアイデアは、Luadebug.getlocaldebug.setlocal関数を使用してすべてのローカル変数 (スタック内の上位値) を見つけ、それらの値/参照を更新することでした。

しかし、変更したい上限値が「範囲外」であるというエラーが表示されます...誰か助けてくれませんか? どうすればよいですか、またはこれを回避するにはどうすればよいですか?

完全なコードは Gistにありますが、重要/関連するスニペットは...

  1. local_upvalues()利用可能なすべての上位値を収集する 27 行目の関数
  1. 行 89 では、debug.setlocal()廃止されたモジュール参照を保持する upvalue を更新しようとしています。