2014-02-05 6 views
0

Я использую трубы в рубине, и я не могу отправить сериализованный объект через трубу. Я встречаю «NoMethodError», который является более странным, потому что я отправляю структуру. Я попытался добавить функцию, но когда я вызываю функцию, я получаю ту же ошибку. Что вызывает это и каково решение?Сериализация объектов, отправленных по трубе «NoMethodError»

Источник:

reader, writer = IO.pipe 

#define the pair object 
Pair = Struct.new(:x, :y) do 
end 

#creates, serializes and sends an object 
fork do 
    temp = Pair.new(1, 2) 
    temp_str = Marshal.dump(temp) 
    writer.puts temp_str 
end 

#prints it's contents 
fork do 
    obj = reader.gets 
     puts obj.x 
     puts obj.y 
end 

Примечание: Я взял основную идею о том, как все должно выглядеть со второго ответа в этой теме: Marshal (Ruby) pipes: sending serialized object to child processes

+0

Если вы намеренно ставите ': ty' в свою структуру, кажется очевидным, что вызов' # y' не будет выполнен, уточните. – Patru

+0

Я не опечатка. Теперь он отредактирован. – Bloodcount

ответ

0

Причина заключается в том, что линия reader.gets возвращает строку и а не рубиновый объект. Измените строку obj = reader.gets на:

obj = Marshal.load(reader.gets) 

И в первом fork блоке, вы не писали выстроенный объект, но объект Pair.new(1,2).to_s. Он должен быть writer.puts temp_str вместо writer.puts temp.

Смежные вопросы