【问题标题】:Use of set_timeout with Sublime Text 3 API在 Sublime Text 3 API 中使用 set_timeout
【发布时间】:2013-11-27 11:02:38
【问题描述】:

我正在尝试使用(如标题所示) 设置超时 插件中 sublime text 3 的功能。
据我了解,在许多情况下都需要使用 lambda 函数。所以我尝试了这个简单的测试:

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

所以我希望我会一次打印一个数字,每个数字之间有 4 秒的延迟。如 Sublime 3 API 中所述:

在给定延迟后(以毫秒为单位)在主线程中运行回调。具有相同延迟的回调将按照它们添加的顺序运行。

但我有 9 个 '9' 在 4 秒后打印。因此,基于循环的第一次迭代,所有“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' ....

【问题讨论】:

    标签: python settimeout sublimetext3 sublime-text-plugin


    【解决方案1】:

    要打印不同的数字,请更改您的插件脚本

    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)
    

    因为所有 lambda 函数都引用相同的 x,并且当它执行时,x 的值达到 9

    【讨论】:

    • 是的,它有效,谢谢。在作业中我们可以替换为:lambda y=x: print(y)
    【解决方案2】:

    首先要了解的是 set_timeout 调用会立即返回。也就是说,您计划在 1 秒内运行所有打印功能。相隔不到1秒。根据您的编辑,您似乎明白了这一点,但只是想我会澄清一下。

    对于总是打印 9,所有的打印语句都引用相同的值。因此,即使安排了第一次打印,它也会引用您要增加的相同 x 值。到打印实际运行时(1 秒后),x 的值为 9。因此,对于每个计划的回调,都会打印 9。

    希望能澄清一些事情。

    【讨论】:

    • 好的,据我所知,lambda 函数将采用 x 的最后一个值,因为没有赋值。通过进行分配,值在每次迭代中都会被替换。你有参考资料来了解更多关于这个主题的信息吗?谢谢=)
    • 我想不出任何东西,尽管我确信它们就在那里。了解事物何时通过引用传递与通过值传递是有帮助的(通常)。
    猜你喜欢
    • 2019-05-16
    • 1970-01-01
    • 2015-03-31
    • 2016-04-24
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多