【发布时间】: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