Ruby 2.5.0 $ stdin.getc对连续调用不起作用

时间:2018-01-26 10:31:16

标签: ruby

我在Ruby 2.5.0中面临$stdin.getc的一个奇怪问题(具体来说:ruby 2.5.0p0(2017-12-25 revision 61468)[x86_64-linux])

似乎有getc方法,也将Enter键存储在其缓冲区中,并将其提供给连续的getc调用。

此脚本演示了它:

puts "This script uses getc 3 times:"

print "a = "; a = $stdin.getc
print "b = "; b = $stdin.getc
print "c = "; c = $stdin.getc

p "a: #{a}, b: #{b}, c: #{c}"

这是输出(我输入1然后输入2)

This script uses getc 3 times:
a = 1
b = c = 2
"a: 1, b: \n, c: 2"

这是输出的截屏视频 https://asciinema.org/a/CFis8pddwZ3ERIA8Np7CCl4wb

知道发生了什么事吗?这是一个错误吗?

1 个答案:

答案 0 :(得分:0)

这不是一个错误,自ruby v1.9.1以来,这种行为一直保持不变。

IO#getc从给定的IO流中读取一个字符。当您输入"1",然后按<Enter>时,您实际上提供的输入为:"1\n"。因此,脚本读取"\n"作为第二个输入字符是正确的行为。

我认为这就是您想要使用的内容:

puts "This script uses gets.chomp 3 times:"

# Note: `String#chomp` removes the trailing newline
print "a = "; a = gets.chomp
print "b = "; b = gets.chomp
print "c = "; c = gets.chomp

p "a: #{a}, b: #{b}, c: #{c}"

## Running the script:
> This script uses gets.chomp 3 times:
> a = 1
> b = 2
> c = 3
> "a: 1, b: 2, c: 3"