Ruby: сохранить переданный объект в переменной-члене - PullRequest
0 голосов
/ 08 декабря 2011

Я новичок в рубине. Чтобы понять это, я решил реализовать парадигму «потребитель / производитель». При выполнении я получаю следующую ошибку?

/my/path/MyFile.rb:11:in `initialize': undefined local variable or method ` mutex' for    #<Writer:0x7f5f60219de8 @buffer=0> (NameError)
    from /my/path/MyFile.rb:63:in `new'
    from /my/path/MyFile.rb:63

В конструкторе я могу получить доступ к объекту мьютекса, но почему назначение его переменной-члену @mutex вызывает вышеуказанную ошибку?

Спасибо заранее Адриан

P.S. Вот код:

require 'thread'

class Writer  
  @buffer
  @mutex
  @numberDeposited
  @running

  def initialize(buffer, mutex, numberDeposited)
    @buffer = buffer
    @mutex = mutex
    @numberDeposited = numberDeposited
    @running = true;
  end

  def write
    while(@running)
      @mutex.synchronize {
        puts "Writer says, \"Doing what I do best... WRITING!\""
        buffer[0] = buffer[0] + 1
      }
      numberDeposited.signal()
      sleep(1)
    end
  end

  def terminate
    @running = false;
  end
end

    class Reader  
      @running
      @buffer
      @mutex
  @numberDeposited

  def initialize(buffer, mutex, numberDeposited)
    @buffer = buffer
    @mutex = mutex
    @numberDeposited = numberDeposited
    @running = true;
  end

  def read()
    while(@running)
      @mutex.synchronize {
        numberDeposited.wait(@mutex)
        puts "Reader says, \"Oh no, Writer that bastard made me work again!­­­ ­­­­­­­­— ­" + buffer[0].to_s() + "­\""
      }
    end
  end

  def terminate
    @running = false;
  end
end

buffer = 0
mutex = Mutex.new
numberDeposited = ConditionVariable.new

writer = Writer.new(buffer, mutex, numberDeposited)
reader = Reader.new(buffer, mutex, numberDeposited)

thread1 = Thread.new{writer.write};
thread2 = Thread.new{reader.read};

thread1.join();
thread2.join();
...