0

我目前正在使用一个程序,该程序利用线程中的回调来操作静态类的类变量。当任何操作对象的方法被调用时,线程就会死掉。如果有人可以看看并告诉我我做错了什么,或者我如何以更好的方式完成同样的事情,将不胜感激。下面是一个复制问题的简单程序。

在 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
4

2 回答 2

0

您正在调用Phone.set_ringer(...)set_ringer被定义为实例方法。使它成为一个类方法(def self.set_ringer(...)),它会工作。

于 2013-06-28T19:31:52.253 回答
0

您应该在线程中设置一个异常处理程序,以便查看是否有任何问题:

begin
  sleep(3)
  reached.call
  Thread.exit
rescue => err
  warn err
end

或者,您可以在任何线程引发异常时使用回溯中止脚本:

Thread.abort_on_exception = true

我看到的错误是这set_ringer不是类方法。确保将其定义为self.set_ringer.

于 2013-06-28T19:32:06.647 回答