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 に答える