2014-04-29 51 views
0

我有一個完美顯示在終端內的進程列表,但我想修改該類,以便消息不僅顯示到STDOUT通道,而且還寫入緩衝區。通過緩衝區在瀏覽器中顯示ruby消息

我知道我必須在文件末尾添加Sinatra方法,以便緩衝區顯示在瀏覽器中。

我的代碼看起來像這樣的時刻(因爲你可以看到,我試圖開始執行緩衝,但是我無法在這裏繼續):

require 'Sinatra' 
$buffer = "buffer" 

module ImpossibleMachine 
    @process = [] 
    g = Game.new(STDOUT) 

    g.start 
      @process[0] = g.action_1(1) 
      @process[1] = g.action_2(@process[0]) 
      @process[2] = g.action_3(@process[1]) 
    g.finish 
end 

# Sinatra route: 

    get '/' do 
     # missing sinatra code 
    end 
+0

我真的不明白你試圖用你的全局'$ buffer'變量來實現(這通常是一個壞主意)。將它分配給你的本地'g'只會覆蓋你對剛剛創建的'Game'對象的引用,''start'方法將在''buffer''字符串上被調用,它不會理解它。你爲什麼試圖在全局字符串中存儲任何東西? – Patru

+0

在讀取代碼時,我不知道將其分配給本地g會覆蓋我對「遊戲」的引用。所以現在我可以擺脫這一點。但是我仍然需要全局的'$ buffer'變量。如何修改該類以便將其寫入緩衝區? – samgbelton

+0

ruby​​中的字符串是可變的,因此您可以使用'+ ='或'<<'以合理透明的方式添加到它們。這仍然沒有回答你想用'$ buffer'做什麼的問題。當然,你可能只是把它輸出到你的「get」中,但那不會是重點。 – Patru

回答

1

我想你需要的是streaming

get '/' do 
    stream do |out| 
    out.puts "Hello World!", "How are you?" 
    out.write "Written #{out.pos} bytes so far!\n" 
    out.putc(65) unless out.closed? 
    out.flush 
    end 
end 
0

我不知道Game模塊是關於什麼的,但除此之外,你可以換warnget,例如DSL extension,例如,

require 'sinatra/base' 

module Sinatra 
    module Buffer 
    def get_with_buffer(path, &block) 
     get path do 
     @outputs ||= [] 
     block.call(@outputs) 
     @outputs.each do |o| 
      warn o 
     end 
     @outputs.join("\n") 
     end 
    end 
    end 
    register Buffer 
end 


app = Sinatra.new do 
    register Sinatra::Buffer 
    get_with_buffer "/" do |outputs| 
    outputs << "First" 
    outputs << "Second" 
    outputs << "Third" 
    end 
end 

app.run! 
相關問題