使用 gets.chomp 而不换行

3
我了解putsgets自动添加的换行符,并知道如何处理它们,但是有没有办法在使用gets输入后保留光标位置而不跳到新行?
例如:
print 'Hello, my name is '
a = gets.chomp
print ', what's your name?'

最终会变成这样

你好,我的名字是Jeremiah, 你叫什么名字?

2个回答

7
你可以使用(文档非常不完整的)getch 来实现这一点:
require 'io/console'
require 'io/wait'

loop do
  chars = STDIN.getch
  chars << STDIN.getch while STDIN.ready?       # Process multi-char paste
  break if ["\r", "\n", "\r\n"].include?(chars)
  STDOUT.print chars
end

参考资料: 相关的后续问题:

enter & IOError: byte oriented read for character buffered IO


这只适用于Ruby 2.1吗?有时我会遇到“IOError:byte oriented read for character buffered IO”错误,我不确定是因为我使用的是Ruby 1.9.3。 - Darek Nędza
我以前从未尝试过2.0之前的这些函数,但如果以1.9.3为准,它们至少部分存在。不过我不知道它们在那时有多少功能。 - Denis de Bernardy
你知道吗...有很多,我喜欢这个 :) 但是我只知道几个 :( - Arup Rakshit
我已经在1.9.3和2.0中尝试过了,我不认为这个错误是由于我使用的版本引起的。在这里:http://stackoverflow.com/questions/21456829/enter-ioerror-byte-oriented-read-for-character-buffered-io 我创建了这个主题。如果你有什么要说的,请说出来。谢谢。 - Darek Nędza

0
也许我漏掉了什么,但是 'gets.chomp' 不是很好用吗?要做你想要的事情,你必须转义撇号或使用双引号,并且你需要在打印的字符串中包含用户输入的内容:
    print 'Hello, my name is '
    a = gets.chomp
    print "#{a}, what's your name?"

    # => Hello, my name is Jeremiah, what's your name?

对我来说可以。 (编辑:在TextMate中工作,而不是在终端中)

否则,您可以像这样做,但我意识到这不完全是您要求的:

    puts "Enter name"
    a = gets.chomp
    puts "Hello, my name is #{a}, what's your name?"

使用您的代码,我在两行上获得输出,名称在第二行开头重复出现(Ruby 2.1)。 - Denis de Bernardy
我直接在TextMate中进行了测试,它的行为符合您的要求。但是,如果我在终端中运行它,我明白您的意思。您不能先获取用户输入,然后在一行上执行打印吗? - Kal
我尝试使用“gets”的额外参数,但似乎不被支持。不过,使用“Ctrl+D”可能会起作用,虽然我还没有尝试过那个 - Denis de Bernardy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接