我在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
知道发生了什么事吗?这是一个错误吗?
答案 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"