我目前正在使用一个程序,该程序利用线程中的回调来操作静态类的类变量。当调用任何操纵对象的方法时,线程就会死掉。如果有人可以看一看并告诉我我做错了什么,或者我如何以更好的方式完成同样的事情,我将非常感激。下面是一个复制问题的简单程序。
在phone.rb中:
class Phone
@@ringer = "RingVibrateRingVibrateRing"
def self.get_ringer
return @@ringer
end
def set_ringer(new_ring)
@@ringer = new_ring
end
def self.calling_you(reached)
puts "Calling you. "
t = Thread.new {
sleep(3)
reached.call
Thread.exit
}
sleep(10)
puts "Thanks for calling me back!"
end
end
在CallTree.rb
中require 'thread'
require 'C:\Users\mabauer\Desktop\phone.rb'
def calling_you_back
ring_sound = Phone.get_ringer
puts "#{ring_sound}"
# The following line is where issues occur, when commented it works fine
Phone.set_ringer("RingingRingingRinging")
ring_sound = Phone.get_ringer
puts "#{ring_sound}"
puts "I called you back."
end
begin
Phone.calling_you(method(:calling_you_back))
end
答案 0 :(得分:0)
您正在调用Phone.set_ringer(...)
,但set_ringer
被定义为实例方法。使它成为一个类方法(def self.set_ringer(...)
),它将起作用。
答案 1 :(得分:0)
您应该在线程中设置一个异常处理程序,以便查看是否出现任何问题:
begin
sleep(3)
reached.call
Thread.exit
rescue => err
warn err
end
或者,当任何线程引发异常时,您可以使脚本中止回溯:
Thread.abort_on_exception = true
我看到的错误是set_ringer
不是类方法。确保将其定义为self.set_ringer
。