Изучаем Ruby. Привет мир! Вывод на экран и ввод с клавиатуры
По устоявшейся традиции начнём с программы «Привет, мир!» (Hello world!)
Для вывода на экран в Ruby используется функция puts
.
Код Ruby:
puts "Привет, мир!" irb(main):001:0> puts "Привет, мир!" Привет, мир! => nil
В Ruby есть несколько способов вывода на экран. Например, мы могли бы написать нашу первую программу таким образом
print "Привет, мир!"
Код Ruby:
irb(main):002:0> print "Привет, мир!" Привет, мир!=> nil
или даже так:
p "Привет, мир!"
При этом обратите внимание, что p – это вовсе не сокращенная запись команды print, как может показаться с первого взгляда. Это отдельный метод. И вывод на экран будет выглядет по другому.
Код Ruby:
irb(main):003:0> p "Привет, мир!" "Привет, мир!" => "Привет, мир!" irb(main):003:0> pp "Привет, мир!" "Привет, мир!" => "Привет, мир!"
В чём разница между этими методами вывода?
puts
и print
почти аналогичны, оба они выводят на экран результат и возвращают nil
, но puts
добавляет перевод строки в конце вывода, а print
– не добавляет.
p
как и puts
выводит результат, добавляет в конце перевод строки, но он также возвращает значение результата, а не nil
.
pp
является расширенной (более красивой - «pretty print») версией p
и его возможности не заметны на примере со строкой (она и так достаточно красива).
Главной особенность Ruby является гибкость его методов. Например для вывода на экран массива Вам не придется создавать цикл. Вывод на экран можно осуществить при помощи тех же функций. Я сознательно ввел в массив пустой элемент. И мы видим, что метод puts
на его месте поставил просто перевод строки
Код Ruby:
irb(main):001:0> puts [1, 2, 3, nil, 4] 1 2 3 4 => nil irb(main):002:0> print [1, 2, 3, nil, 4] [1, 2, 3, nil, 4]=> nil irb(main):003:0> p [1, 2, 3, nil, 4] [1, 2, 3, nil, 4] => [1, 2, 3, nil, 4] irb(main):004:0> pp [1, 2, 3, nil, 4] [1, 2, 3, nil, 4] => [1, 2, 3, nil, 4]
Но мы снова не увидели разницы между p
и pp
!
Для того чтобы её заметить, будем использовать более сложные типы данных, хэши (так в Ruby называются ассоциативные массивы).
Код Ruby:
irb(main):001:0> h = {first:1, second:2, "third" => {sf:"false", ss:3}, "fourth" => {tf:"flag", ts:4}, fifth:5} => {:first=>1, :second=>2, "third"=>{:sf=>"false", :ss=>3}, "fourth"=>{:tf=>"flag", :ts=>4}, :fifth=>5} irb(main):002:0> puts h {:first=>1, :second=>2, "third"=>{:sf=>"false", :ss=>3}, "fourth"=>{:tf=>"flag", :ts=>4}, :fifth=>5} => nil irb(main):003:0> print h {:first=>1, :second=>2, "third"=>{:sf=>"false", :ss=>3}, "fourth"=>{:tf=>"flag", :ts=>4}, :fifth=>5}=> nil irb(main):004:0> p h {:first=>1, :second=>2, "third"=>{:sf=>"false", :ss=>3}, "fourth"=>{:tf=>"flag", :ts=>4}, :fifth=>5} => {:first=>1, :second=>2, "third"=>{:sf=>"false", :ss=>3}, "fourth"=>{:tf=>"flag", :ts=>4}, :fifth=>5} irb(main):005:0> pp h {:first=>1, :second=>2, "third"=>{:sf=>"false", :ss=>3}, "fourth"=>{:tf=>"flag", :ts=>4}, :fifth=>5} => {:first=>1, :second=>2, "third"=>{:sf=>"false", :ss=>3}, "fourth"=>{:tf=>"flag", :ts=>4}, :fifth=>5}
Ну вот, выводить на экран мы научились, но любая программа обычно требует ввода данных извне, например, с клавиатуры.
Логично предположить, что если для вывода используется метод puts
, то для ввода — gets
. Так оно и есть…
Код Ruby:
irb(main):001:0> n = gets 15 => "15\n"
Но почему в конце строки стоит символ перевода строки, и как его убрать? А может его на самом деле и нет? Проверим
Код Ruby:
irb(main):002:0> puts n 15 => nil irb(main):003:0> print n 15 => nil irb(main):004:0> p n "15\n" => "15\n"
puts
и print
нам не показывают перевод строки в явном виде. Хотя если присмотреться, мы заметим, что в выводе print
появился «лишний» перевод строки. А вот метод p
нам явно предъявляет его наличие.
Но что делать, если нам этот перевод строки не нужен?
Код Ruby:
irb(main):005:0> n = gets.chomp 16 => "16" irb(main):006:0> puts n 16 => nil irb(main):007:0> print n 16=> nil irb(main):008:0> p n "16" => "16"
Но до сих пор мы выводили на экран только чистые данные. А как вывести на экран что-то типа «2 + 1 = 3» , где 2 — переменная, введенная с клавиатуры?
Для подмены имени на значение переменной при выводе используется конструкция #{n}
Поэтому мы могли бы использовать такую конструкцию:
Код Ruby:
puts "#{a} + 1 = #{a + 1}"
Но… В ответ мы получаем ошибку
TypeError (no implicit conversion of Integer into String)
Дело в том, что переменная a у нас имеет тип «строка». Ruby не производит автоматического приведения типов, в отличии от, например PHP. В итоге Ruby не может понять, что от него хотят, когда пытаются прибавить число к строке.
Слава богу, в Ruby привести типы — не проблема. Например, приведение строки к целому осуществляется методом to_i
самой строки.
Код Ruby:
puts "#{a} + 1 = #{a.to_i + 1}" irb(main):001:0> a = gets.chomp 2 => "2" irb(main):002:0> puts "#{a} + 1 = #{a + 1}" Traceback (most recent call last): 5: from D:/Program Files/Ruby30-x64/bin/irb.cmd:31:in '<main>' 4: from D:/Program Files/Ruby30-x64/bin/irb.cmd:31:in 'load' 3: from D:/Program Files/Ruby30-x64/lib/ruby/gems/3.0.0/gems/irb-1.3.0/exe/irb:11:in '<top (required)>' 2: from (irb):2:in '<main>' 1: from (irb):2:in '+' TypeError (no implicit conversion of Integer into String) irb(main):003:0> puts "#{a} + 1 = #{a.to_i + 1}" 2 + 1 = 3 => nil irb(main):004:0> a = 7 => 7 irb(main):005:0> puts "#{a} + 1 = #{a.to_i + 1}" 7 + 1 = 8 => nil
Оставьте свой комментарий
Войдите, чтобы оставлять комментарии
Оставить комментарий как гость