只是为了好玩,我如何编写一个ruby程序,一次缓慢打印到stdout一个字符?

时间:2011-02-08 01:15:24

标签: ruby stdout

我认为这可能有效

 "a b c d e f g h i j k".each {|c| putc c ; sleep 0.25}

我希望看到“a b c d e f j”一次打印一个字符,每个字符之间间隔0.25秒。但相反,整个字符串会立即打印出来。

5 个答案:

答案 0 :(得分:5)

两件事:

  1. 在使用each之前,您需要将该字符串拆分为数组。
  2. 关闭output buffering

    $stdout.sync = true
    "a b c d d e f g h i j k".split(" ").each {|c| putc c ; sleep 0.25}
    

答案 1 :(得分:5)

两件事:

  1. 您需要使用.each_char来迭代字符。在Ruby 1.8中,String.each将逐行进行。在Ruby 1.9中,不推荐使用String.each
  2. 如果您希望立即显示字符,则应手动清除$stdout。否则,它们往往会被缓冲,以便角色最后一次出现。
  3. #!/usr/bin/env ruby
    "a b c d d e f g h i j k".each_char {|c| putc c ; sleep 0.25; $stdout.flush }
    

答案 2 :(得分:2)

Ruby缓冲输出,并在达到一定大小后将其刷新到标准输出。你可以强迫它像这样冲洗。

"a b c d e f g h i j k".each_char do |char|
   putc char
   $stdout.flush
   sleep 0.25
end

注意:如果您在打印时不希望字符之间有空格,请使用.split.each代替.each_char

只是为了好玩:使用这样的定义:

def slowly
  yield.each_char { |c| putc c; $stdout.flush; sleep 0.25 }
end

你可以这样做:

slowly do
  "a b c d e f g h i j k"
end

答案 3 :(得分:1)

尝试:

%w"a b c d e f g h i j k".each {|c| putc c ; sleep 0.25}

这与Ruby 1.9.2一样,在每次写入之间不需要STDOUT来刷新。

如果您希望插入空格,请移除%w并使用each_char代替each

答案 4 :(得分:0)

这是我的“慢速打印”方式:

cPickle