gets.chomp без перехода на новую строку

Я понимаю, что \n автоматически находится в конце puts и gets, и как с ними бороться, но есть ли способ удержать точку отображения («положение курсора», если хотите) от перемещения на новую строку после нажатия Enter для ввода с помощью gets ?

e.g.

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

в итоге будет выглядеть

Привет, меня зовут Иеремия, а тебя?


person jeremiah    schedule 14.01.2014    source источник


Ответы (2)


Вы можете сделать это, используя (очень плохо документированный) 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: байт-ориентированное чтение для ввода-вывода с буферизацией символов

person Denis de Bernardy    schedule 14.01.2014
comment
Это только для Ruby 2.1? Я иногда получаю IOError: byte oriented read for character buffered IO, и я не уверен, что это из-за того, что я использую Ruby 1.9.3. - person Darek Nędza; 14.01.2014
comment
Я никогда не пробовал функции до 2.0, но они, по крайней мере, частично есть, если судить по 1.9.3. Однако у меня нет ни малейшего представления о том, насколько функциональными они были тогда. - person Denis de Bernardy; 14.01.2014
comment
Знаешь...много...мне это нравится :) но знаю мало :( - person Arup Rakshit; 14.01.2014
comment
Я пробовал это в 1.9.3 и 2.0, и я не думаю, что эта ошибка появляется из-за версии, которую я использую. Здесь: stackoverflow.com/questions/21456829/ Я создал тему. Если у вас есть что сказать, пожалуйста, сделайте это. Спасибо. - person Darek Nędza; 30.01.2014

Возможно, я что-то упускаю, но '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?"
person Kal    schedule 14.01.2014
comment
Используя ваш код, я получаю вывод в две строки с повторением имени в начале второй (Ruby 2.1). - person Denis de Bernardy; 14.01.2014
comment
Я тестировал его непосредственно в TextMate, и он вел себя так, как вы хотели. Но да, если я запущу его в терминале, я пойму, что вы имеете в виду. Есть ли какая-то причина, по которой вы не можете сначала получить пользовательский ввод, а затем просто выполнить печать в одной строке? - person Kal; 14.01.2014
comment
Я поэкспериментировал с дополнительными параметрами gets, и, похоже, они не поддерживаются. Ctrl+D, возможно, сработает — я не пробовал это. - person Denis de Bernardy; 14.01.2014