Для ввода данных с клавиатуры можно использовать метод gets, который помещает в строку все вводимые символы. Ввод завершается нажатием на клавишу Enter. Подобным же образом действует и метод readline.
Создайте файл с именем input.rb, в который поместите следующий текст:
print "Введите ваше имя: " a=gets print "Привет, ", a # еще раз print "Введите ваше имя: " a=readline print "Привет, ", a
В первой части нашего курса мы уже упоминали, что с точки зрения ОС Linux входной и выходной потоки данных (по умолчанию - ввод с клавиатуры и вывод в окно shell) ничем не отличаются от других файлов - тот же поток байтов. Поэтому ввод комбинации клавиш Ctrl+D, означающей прерывание ввода данных, расценивается аналогично концу файла.
В нашем случае действие методов readline и gets отличается лишь реакцией на обнаружение конца файла: в первом случае выдается ошибка EOFError (End Of File Error), а во втором возвращается объект nil.
Обратите внимание, что последний символ введенной строки (независимо от используемого метода) есть \n. Это является следствием нажатия на клавишу Enter (в других операционных системах конец строки может кодироваться другими символами).
print "Введите строку: " a=gets b=a.size print "ASCII код последнего символа равен ", a[b - 1], "\n"
Выше уже описывался метод chop, позволяющий удалить последний символ строки (либо два последних символа, если они есть \r\n).
print "Введите ваше имя: " a=gets print a, ", привет!\n" b=a.chop print b, ", привет!\n"
Как видите, символ перевода на новую строку удален.
В Ruby многие методы имеют своих "двойников", содержащие знак ! после своего имени. Это так называемые "опасные" методы, которые разрушают объект, к которому они применяются. Так, для объектов типа String допустимы как метод chop, так и chop!. Первый из них, примененный к строке, возвращает новый объект - строку с удаленным последним символом, а метод chop! изменяет сам исходный объект.
a="123456" b=a.chop puts a, b b=a.chop! puts a, b
Изменим программу, добавив в нее метод chop!:
print "Введите ваше имя: " a=gets.chop! print "Привет ", a, "! Как поживаешь?\n"
Теперь наше приветствие печатается на одной строке.
При вводе числовой информации следует принудительно преобразовать полученную строку в число при помощи методов to_i и to_f. Ниже приводится фрагмент программы, запрашивающей два числа и печатающей результаты их обработки.
print "Введите целое число: " num=gets.to_i print "Остаток от деления на 5 равен #{num%5}\n" print "Введите число (точка отделяет дробную часть): " num=gets.to_f print "При округлении получилось число #{num.round}\n"
Ранее рассмотренный метод eval позволяет значительно расширить возможности ввода данных.
Предположим, что нам требуется ввести не число, арифметическое выражение (возможно, содержащее операции *, /, +, -, ** или имена методов для работы с числами). Тогда, после удаления символа перевода строки, следует к полученной строке применить метод eval:
puts "Ruby не боится огромных чисел." puts "Введите страшное арифметическое выражение, " puts "например, 14**256+3*17" puts eval gets.chop!
С помощью этого метода можно выполнить команды, введенные с клавиатуры.
puts "Введите команды, разделяя их точкой с запятой:" eval gets.chop!
Ниже приводится возможный ввод и вывод программы:
Введите команды, разделяя их точкой с запятой: puts Time.now; print "2+3="; puts 2+3 Sat Mar 30 11:47:42 MSK 2002 2+3=5
В этом примере были введены три команды. Первая напечатала текущее время, вторая напечатала строку "2+3=", а последняя вычислила и напечатала сумму 2+3.