【问题标题】:Display ruby messages in a browser via a buffer [closed]通过缓冲区在浏览器中显示 ruby​​ 消息 [关闭]
【发布时间】:2014-04-29 15:25:22
【问题描述】:

我有一个完美显示在终端中的进程列表,但我想修改类,以便消息不仅显示到 STDOUT 通道,而且还写入缓冲区。

我知道我必须在文件末尾添加一个 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

【问题讨论】:

  • 我真的不明白你试图用你的全局 $buffer 变量来实现什么(这通常是一个坏主意)。将它分配给您的本地 g 只会覆盖您对刚刚创建的 Game 对象的引用,并且将在 "buffer" 字符串上调用 #start 方法,这将无法理解。你为什么要在全局字符串中存储任何东西?
  • 在代码中读取时,我不知道将其分配给本地 g 会覆盖我对“游戏”的引用。所以现在我可以摆脱它了。但是我仍然需要全局 '$buffer' 变量。如何修改类以将其写入缓冲区?
  • ruby 中的字符串是可变的,因此您可以使用+=<< 以合理透明的方式附加到它们。这仍然不能回答您想用$buffer 做什么 的问题。当然,您可以将其输出到您的get,但这并不是重点。
  • 如果您的Game 类输出到$buffer,您可以在get '/' do 中返回其内容,或者按照@UriAgassi 的建议通过stream 传递它。试试看。
  • $buffer 的使用是代码异味。您很少需要在 Ruby 中使用全局变量,您应该避免使用它们,直到您真正了解它们何时合适为止。除此之外,您使用该模块的方式值得怀疑。我建议摆脱它并简化。查看 Sinatra 教程并更密切地遵循它的指导。

标签: ruby sinatra buffer stdout


【解决方案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

【讨论】:

    【解决方案2】:

    我不知道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!
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-20
      • 2019-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多