2014-01-14 38 views
3

我了解\ n自动在putsgets的末尾,以及如何处理这些,但是有没有办法保持显示点('光标位置',如果你愿意)在输入gets后输入一个新行后移动到新行?gets.chomp没有移动到新行

例如

print 'Hello, my name is ' 
a = gets.chomp 
print ', what's your name?' 

最终会看起来像

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

回答

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

+0

这是唯一的Ruby 2.1?有时,我得到'IOError:面向字符的字符读取字符缓冲IO',我不确定是否因为我使用了Ruby 1.9.3。 –

+0

我从来没有尝试2.0之前的功能,但他们至少部分围绕如果1.9.3是任何事情经过。尽管如此,我还没有开始了解他们功能如何的线索。 –

+0

你知道...很多...我喜欢这:)但我知道几个:( –

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?" 
+0

使用你的代码,我得到了两行代码,第二个代码的开头重复了这个名字(Ruby 2.1) –

+0

我直接在TextMate中测试它,它的行为如你所愿。是的,如果我在终端中运行它,我明白你的意思。是否有任何理由,你不能首先得到用户输入,然后只在一行上打印? – Kal

+0

我玩过额外的'gets'参数, ,并且它似乎没有被支持。但是'Ctrl + D'可能工作,但是 - 我没有尝试*那*。 –