【问题标题】:Ruby prints word by word with seconds in betweenRuby 以秒为单位逐字打印
【发布时间】:2014-09-20 07:58:03
【问题描述】:
para = "do ray me fa so la te do."
para.gsub!(' ', "#{sleep(2)}")
$stdout.sync = true

我希望它在同一行打印出来:(do ray me fa so la te do)。下面显示列,因为“#”使整行变灰。

print para
do#sleep(2) 
ray#sleep(2) 
me#sleep(2) 
fa#sleep(2) 
so#sleep(2) 
la#sleep(2) 
te#sleep(2) 
do#sleep(2)

首先,当我调用 puts 时,“do”首先出现,然后它暂停了一下,然后在同一行显示“ray”等。这可能吗?作为 Ruby 学习者,他们说你不能“干”。

谢谢!

【问题讨论】:

  • 如果是这样,那当然是有可能的。
  • 有人出于我不知道的原因投入了这个。我希望它不打印出整个字符串,而是逐字打印,但间隔几秒钟。
  • 我认为你不知道自己在做什么。 para.split(' ').each {|word| puts word; sleep(2) }

标签: ruby


【解决方案1】:

我会这样做:

$stdout.sync = true
paragraph = "do ray me fa so la te do."

paragraph.split.each do |word|
  print "#{word} "
  sleep 2
end

【讨论】:

  • 那没有字。它将所有单词压缩在一起,并且在显示完整单词之前会暂停 16 秒。我想先打印“do”,然后是“ray”等
  • @Sylar 你是否在命令行中使用ruby foo.rb 运行这个小程序?比它应该工作。如果您在编辑器或 IDE 中运行脚本,则取决于该工具的设置。
  • 好的,现在可以了,但我需要单词之间的空格。
  • @spickermann :$stdout.sync = true 在您的代码中的用途是什么?我通过删除第一行尝试了这段代码,但它仍然返回相同的结果。你能解释一下它的作用吗?我会感激的
  • @GaganGami :这会强制操作系统立即刷新 IO 输出。如果您不这样做,可能会发生您的 IO 有点慢,因为操作系统想要最小化 IO 操作。通常这不是问题,但在这种情况下,如果在两个 print 操作之间定义了 pause,这可能会有所帮助。
【解决方案2】:

你正在做的是用另一个字符串替换一个字符串,其中包括一些 ruby​​ 代码,但由于它会被转义,它永远不会执行。

为了实现你想要的,我建议尝试这种方法:

"a b c d e f g".split(' ').each do |s| 
   puts s 
   sleep(1) 
end

因此,对于每个字符串,您都需要一秒钟。

【讨论】:

  • 不是每个字符串,而是字符串中的每个单词。我希望“do”首先出现,然后是“ray”等
  • @Sylar 对不起,我不明白你想要什么,如果你替换字符串,你会按照你想要的顺序得到字符串。
【解决方案3】:

这就是问题所在:

para.gsub!(' ', "#{sleep(2)}")

这会执行sleep 2,两秒内什么都不做,返回2。这只是para.gsub!(' ', 2)的慢速处理方式

【讨论】:

    猜你喜欢
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    相关资源
    最近更新 更多