1

(タイトルが示すように) プラグインで崇高なテキスト 3 の set_timeout 関数を使用しようとしています。
私が理解したところでは、多くの場合、ラムダ関数の使用が必要です。だから私はこの簡単なテストを試しました:

class SetTimeoutTestCommand(sublime_plugin.WindowCommand):
    def run(self):
        for x in range(1,10):
            sublime.set_timeout(lambda : print(x), 4000)

そのため、それぞれの間に 4 秒の遅延で、一度に 1 つずつ番号が印刷されると予想していました。Sublime 3 API で説明されているように:

指定された遅延 (ミリ秒単位) の後、メイン スレッドでコールバックを実行します。遅延が等しいコールバックは、追加された順序で実行されます。

しかし、代わりに、4 秒後に印刷される 9 つの '9' があります。したがって、ループの最初の繰り返しに基づいて、すべての「9」が同時に出力されます。
これを解決するために私に何ができるか考えていますか?

前もって感謝します !

編集:これが機能することがわかりました(まあ、「9」を9回印刷し、それぞれの間に1秒の遅延があります:

class SetTimeoutTestCommand(sublime_plugin.WindowCommand):
    def run(self):
        for x in range(1,10):
            sublime.set_timeout(lambda : print(x), x*1000)

しかし、問題が残っています: '9' しか出力されません ....

4

2 に答える 2

5

異なる数字を出力するには、これでプラグイン スクリプトを変更します

class SetTimeoutTestCommand(sublime_plugin.WindowCommand):
    def run(self, edit):
        for x in range(1,10):
            sublime.set_timeout(lambda x=x: print(x), x*1000)

すべてのラムダ関数は同じものを参照し、x実行されるとx値が に達するため9です。

于 2013-11-30T10:02:28.180 に答える
2

最初に理解しておくべきことは、set_timeout 呼び出しがすぐに戻ることです。つまり、すべての印刷機能を 1 秒で実行するようにスケジュールしています。お互いに1秒もありません。あなたの編集に基づいて、あなたはそれを理解したようですが、私は明確にしたいと思いました.

常に 9 を出力する場合は、すべての print ステートメントが同じ値を参照しています。そのため、最初の印刷がスケジュールされている場合でも、インクリメントしている同じ x 値を参照します。出力が実際に実行されるまで (1 秒後)、x の値は 9 です。したがって、スケジュールされたコールバックごとに 9 が出力されます。

物事を明確にすることを願っています。

于 2013-11-30T09:44:48.300 に答える