> irb> require 'scanf'
> irb> begin
> irb> a = $stdin.scanf("%d")
> irb> b = $stdin.scanf("%d")
> irb> puts a, b
> irb> end
> 10 20 30 40^D
> 10
> irb>
> 
> となって、1つのストリームは一回しかスキャンしてくれないようです。

 こういう場合は、以下のようにしたいところなのですが...

irb(main):001:0> require 'scanf'
irb(main):002:0> $stdin.scanf("%d") {|x| p x}
10 20 30 40
[10]
^Z
=> [nil]

 現状では、これでも最初の要素しか読まないんですよね。
 これにハマった当時、以下のように scanf.rb の IO#block_scanf を
すげ替えてしのぎました。

irb(main):003:0> class IO
irb(main):004:1>   def block_scanf(fstr)
irb(main):005:2>     fs = Scanf::FormatString.new(fstr)
irb(main):006:2>     final = []
irb(main):007:2>     while !eof?
irb(main):008:3>       str = gets
irb(main):009:3>       begin
irb(main):010:4*         current = fs.match(str)
irb(main):011:4>         final << yield(current) unless current.empty?
irb(main):012:4>         str = fs.string_left
irb(main):013:4>       end until current.empty? || str.empty?
irb(main):014:3>     end
irb(main):015:2>     return final
irb(main):016:2>   end
irb(main):017:1> end # class IO
=> nil
irb(main):018:0> $stdin.scanf("%d") {|x| p x}
10 20 30 40
[10]
[20]
[30]
[40]
^Z
=> [nil, nil, nil, nil]
irb(main):019:0>

-- 
北島雅博(かとんぼ)