代码之家  ›  专栏  ›  技术社区  ›  sawa

螺纹和环

  •  1
  • sawa  · 技术社区  · 10 年前

    我正在尝试编写与此代码等效的代码:

    Thread.new do loop do
      ...
    end end.join
    

    使用类方法 Thread.loop 这样地:

    Thread.loop do
      ...
    end.join
    

    我定义方法如下:

    class Thread
      def self.loop ≺ Thread.new{loop{pr.call}} end
    end
    

    并这样使用:

    Thread.loop do
      sleep(1)
      puts "foo"
    end.join
    

    我希望它相当于

    Thread.new do loop do
      sleep(1)
      puts "foo"
    end end.join
    

    但事实并非如此。如何修复代码?

    loop 在…内 Thread.new{} 被解释为方法 而不是关键字?方法调用和关键字之间的优先级关系是什么?

    1 回复  |  直到 10 年前
        1
  •  2
  •   sawa    10 年前

    塔德曼和斯特凡让我意识到 loop 是上的私有方法 Kernel 考虑到这一点,我能够这样做:

    class Thread
      def self.loop &pr
        Thread.new{Object.instance_exec{loop{pr.call}}}
      end
    end
    

    或如BroiSatse所建议的,

    class Thread
      def self.loop &pr
        Thread.new{super{pr.call}}
      end
    end
    

    并且它按预期工作。