Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 线程和循环_Ruby_Multithreading_Loops - Fatal编程技术网

Ruby 线程和循环

Ruby 线程和循环,ruby,multithreading,loops,Ruby,Multithreading,Loops,我正在尝试编写与此代码等效的代码: Thread.new do loop do ... end end.join 像这样使用类方法Thread.loop: Thread.loop do ... end.join Thread.loop do sleep(1) puts "foo" end.join class Thread def self.loop &pr Thread.new{Object.instance_exec{loop{pr.call}}}

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

Thread.new do loop do
  ...
end end.join
像这样使用类方法
Thread.loop

Thread.loop do
  ...
end.join
Thread.loop do
  sleep(1)
  puts "foo"
end.join
class Thread
  def self.loop &pr
    Thread.new{Object.instance_exec{loop{pr.call}}}
  end
end
我对该方法的定义如下:

class Thread
  def self.loop ≺ Thread.new{loop{pr.call}} end
end
然后像这样使用它:

Thread.loop do
  ...
end.join
Thread.loop do
  sleep(1)
  puts "foo"
end.join
class Thread
  def self.loop &pr
    Thread.new{Object.instance_exec{loop{pr.call}}}
  end
end
我希望它相当于

Thread.new do loop do
  sleep(1)
  puts "foo"
end end.join
但事实并非如此。如何修复代码


循环
是否在
线程内。新{}
被解释为方法
循环
而不是关键字?方法调用和关键字之间的优先级关系是什么?

tadman和Stefan让我认识到,
循环
内核
上的私有方法。考虑到这一点,我可以这样做:

Thread.loop do
  ...
end.join
Thread.loop do
  sleep(1)
  puts "foo"
end.join
class Thread
  def self.loop &pr
    Thread.new{Object.instance_exec{loop{pr.call}}}
  end
end
或者按照布罗伊萨泽的建议

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

它可以按预期工作。

您只需挤压
Object.loop
,这是一个私有方法。您还在
loop
中调用
loop
,这可能会导致意外递归。修补
线程
可能是个坏主意。为什么不创建自己的类来做任何你想做的事情呢?@tadman在我定义之前有
Thread.loop
?我认为
loop
是一个关键字。它不是关键字,但它是一个不应该像那样修补的方法。它存在于
对象中
@tadman谢谢。我根据你的信息想出了一个解决方案。那就是
内核#循环
,不是吗?为什么不调用
超级
,而不是
对象。instance_exec{loop…}
?@broisasze你可能是对的。(也许,我下意识地想到有人在类中定义
循环
,介于两者之间,所以我认为显式提及会更有力;我不确定我下意识的想法,只是一个猜测)。@sawa你甚至不需要proc参数:
def self.loop;Thread.new{super};结束
您还可以执行Kernel.loop{…}-可能更容易操作read@sawa
Kernel
方法同时声明为私有实例方法和(公共)单例方法