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@sawaKernel
方法同时声明为私有实例方法和(公共)单例方法