Разница между puts, print, p, pp
Написано по мотивам этой статьи (вольный перевод и адаптация).
В Ruby для вывода данных в консоли доступно 4 метода: puts
, print
, p
, pp
. Рассмотрим подробнее:
puts
> puts "Hello World!" Hello World! => nil
puts
печатает всё, что передаётся методу, а в конце печатается символ перевода строки.
При помощи puts
можно вывести построчно все элементы массива.
> puts [1, 2, 3] 1 2 3 => nil
Всё, что передается методу puts
благодаря методу .to_s
превращается в строку. То есть если у вас в массиве есть nil
-элементы, то при использовании puts
они будут напечатаны в виде пустой строки.
> puts [1, nil,nil, 4] 1 4 => nil
Этот метод похож на puts
, но он не добавляет в конце символ новой строки:
> print "Hello World!" Hello World!=> nil
Если передать методу массив то он полностью выведет его включая скобки.
> print [1, 2, 3][1, 2, 3]=> nil
После каждого использования
(или print
) вы видите «nil» — это происходит потому, что любой метод в ruby возвращает какое то значение, и puts
/print
возвращают ничего, специальный объект — nil
.
p
Метод p
для вывода использует метод .inspect
, который есть у любого объекта в руби. Получается вывод объекта в наиболее «говорящем» для разработчика виде:
irb(main):006:0> p "Hello World!" "Hello World!" => "Hello World!" irb(main):007:0> p [1, 2, 3] [1, 2, 3] => [1, 2, 3]
Важно, что метод p
возвращает уже не nil
, а сам объект, который ему передали.
Как видно в примере
выводит на печать то что ему передали в качестве аргумента и возвращает тот же объект.
pp
Метод pp
(от англ. pretty print) — это специальная версия p
, которая выводит аргумент в более читаемом виде.
Пример с хэшем выглядит так:
> h = {some: 1, "the" => {subone: "true", subtwo: [1,2,"3333", {subsub: "one", nonenone: {twotwo: [{keyone: 1, keytwo: ["222","sdsd"]},1,2], some: "free"}}]}, ne: "xt"} > pp h {:some=>1, "the"=> {:subone=>"true", :subtwo=> [1, 2, "3333", {:subsub=>"one", :nonenone=> {:twotwo=>[{:keyone=>1, :keytwo=>["222", "sdsd"]}, 1, 2], :some=>"free"}}]}, :ne=>"xt"} => {:some=>1, "the"=>{:subone=>"true", :subtwo=>[1, 2, "3333", {:subsub=>"one", :nonenone=>{:twotwo=>[{:keyone=>1, :keytwo=>["222", "sdsd"]}, 1, 2], :some=>"free"}}]}, :ne=>"xt"}
Возвращает, как и p
переданный объект.
ap
Есть ещё более «крутой» способ вывести что-то — гем awesome_print
. Установить его можно командой:
gem install awesome_print
Далее в irb необходимо включить гем
> require "awesome_print" => true
Этот метод ap
выводит данные не только в удобочитаемом виде, но ещё и с нужными отступами, а также печатает значение индекса рядом с каждым элементом массива.
Вот наш пример с хэшем:
> h = {some: 1, "the" => {subone: "true", subtwo: [1,2,"3333", {subsub: "one", nonenone: {twotwo: [{keyone: 1, keytwo: ["222","sdsd"]},1,2], some: "free"}}]}, ne: "xt"} > ap { :some => 1, "the" => { :subone => "true", :subtwo => [ [0] 1, [1] 2, [2] "3333", [3] { :subsub => "one", :nonenone => { :twotwo => [ [0] { :keyone => 1, :keytwo => [ [0] "222", [1] "sdsd" ] }, [1] 1, [2] 2 ], :some => "free" } } ] }, :ne => "xt" } => nil
Ruby за двадцать минут
1 | 2 | 3 | 4
Что если мы хотим сказать “Hello” без утомления наших пальцев? Мы должны создать метод!
irb(main):010:0> def h irb(main):011:1> puts "Hello World!" irb(main):012:1> end => nil
Код def h
означает начало объявление метода. Он говорит Ruby, что мы
определяем метод, имя которого h
. Следующая строка – тело метода, та
же строка, что мы видели раньше: puts "Hello World"
. И, наконец,
последняя строка, end
, говорит Ruby, что мы завершили объявление
метода. Ответ от Ruby, => nil
, говорит нам, что он понял, что мы
завершили объявление метода.
Кратко о повторяющихся жизнях метода
Теперь давайте попробуем вызвать метод несколько раз:
irb(main):013:0> h Hello World! => nil irb(main):014:0> h() Hello World! => nil
Ну, это было просто. Вызвать метод в Ruby так же просто, как просто упомянуть его имя в коде. Если метод не принимает параметры – это все что вам нужно сделать. Вы можете добавить пустые скобки, если вам так нравится, но это не обязательно.
Что если мы хотим сказать hello одному человеку, а не всему миру?
Просто переопределим метод h
, чтобы он принимал имя как параметр.
irb(main):015:0> def h(name) irb(main):016:1> puts "Hello #{name}!" irb(main):017:1> end => nil irb(main):018:0> h("Matz") Hello Matz! => nil
Итак, это работает… но давайте на секунду задумаемся, что здесь происходит.
Места для интерполяции в String
Что такое #{name}
в коде выше? Это способ Ruby вставить что-либо в
строку. Кусок кода между фигурными скобками превратится в строку (если
это еще не строка) и потом подставится во внешнюю строку в этом месте.
Вы также можете использовать это, чтобы убедиться, что имя будет с
большой буквы:
irb(main):019:0> def h(name = "World") irb(main):020:1> puts "Hello #{name.capitalize}!" irb(main):021:1> end => nil irb(main):022:0> h "chris" Hello Chris! => nil irb(main):023:0> h Hello World! => nil
Вы должны здесь отметить несколько других приемов. Один из них, что мы
опять вызываем метод без скобок. Если очевидно то, что вы хотите сделать
– скобки не обязательны. Другой прием – это параметр по умолчанию
. Это означает что, “Если имя не передано в качестве параметра,
используй параметр по умолчанию World
”.
Эволюционируем в Greeter (Приветствующего)
Что если мы хотим создать реального приветствующего, того кто запомнит ваше имя и поприветствует вас и всегда будет относиться к вам с уважением? Вы можете использовать для этого объект. Давайте создадим класс “Greeter”.
irb(main):024:0> class Greeter irb(main):025:1> def initialize(name = "World") irb(main):026:2> @name = name irb(main):027:2> end irb(main):028:1> def say_hi irb(main):029:2> puts "Hi #{@name}!" irb(main):030:2> end irb(main):031:1> def say_bye irb(main):032:2> puts "Bye #{@name}, come back soon." irb(main):033:2> end irb(main):034:1> end => nil
Новое ключевое слово здесь — class
. Оно служит для объявления нового
класса, который мы назвали Greeter и несколько методов для этого класса.
Также заметьте @name
. Это переменная объекта и она доступна для всех
методов в классе. Как вы можете видеть, она используется методами say_hi
и say_bye
Итак, как мы сможем заставить этот класс Greeter работать? Создадим объект.
Понимание различий между Put, Print и P
В Ruby есть много способов напечатать что-либо.
Вот самые полезные :
- ставит
- распечатать
- р
Но чем они отличаются?
И когда следует использовать тот или иной ?
Вот что вы узнаете из этой статьи!
Как печатать без новой строки
Когда вы хотите напечатать что-то на экране для просмотра пользователем, вы обычно используете ставит
.
Как это :
ставит "Привет!"
Puts автоматически добавляет новую строку в конец вашего сообщения каждый раз, когда вы его используете.
Если вам не нужна новая строка, используйте print
.
Пример :
распечатать 123
В следующий раз, когда вы напечатаете
что-то, это будет та же строка, что и в вашем последнем сообщении.
Пример :
распечатать 123 распечатать 456 распечатать 789123456789
Но если вы используете puts :
ставит 123 ставит 456 ставит 789 123 456 789
Каждое сообщение имеет свою строку!
Помещения также обрабатывают массивы по-другому.
Пример :
ставит [1,2] 1 2 распечатать [1,2] [1,2]
Вот еще отличие :
Ставит попытки преобразовать все в строку (вызовом to_s
).
Почему это важно?
Потому что если вы пытаетесь помещает
массив с нулевыми значениями…
Он покажет несколько пустых строк!
Пример :
ставит [1,ноль,ноль,2] 1 2
Подводя итог, помещает
и print
:
- Преобразование вещей в строки, даже если это означает пустую строку
Только ставит
:
- Добавляет новую строку в конец ваших сообщений
- Отображает элементы массива по одному на строку
Выход отладки с P
А как насчет put vs p?
p
— это метод, который показывает более «сырой» вариант объекта.
Например, :
> ставит "Рубин крут" Руби крут > p "Рубин крут" "Рубин крут"
Для чего нужен p
?
Отладка.
Когда вы ищете такие вещи, как (обычно невидимые) символы новой строки, или хотите убедиться, что какое-то значение правильное, тогда вы используете p
.
Другое отличие :
- ставит всегда возвращает ноль
- p возвращает объект, который вы ему передаете
Это более техническая разница…
Но она может появиться, если вы попытаетесь поместить
переменную в качестве последней строки метода, и вы используете возвращаемое значение этого метода.
Пример :
номера защиты ставит 123 конец числа # ноль
В этом примере метод чисел
отобразит на экране 123, но его возвращаемое значение будет ноль
.
Если вы попробуете :
результат = числа
Тогда результатом
будет nil
вместо 123.
Но если вы используете p
, то это сработает.
Красивая печать
У Ruby есть еще один метод печати.
Звонил по номеру стр.
.
Это похоже на p
, но лучше печатает большие хэши и массивы.
Обратите внимание, что в более старой версии Ruby (до 2.4) необходимо выполнить требуется «pp»
, чтобы получить доступ к этому методу.
Видеоруководство
Резюме
Вы узнали о различиях между put, print и p в Ruby!
Сейчас время тренировки .
Если вы будете практиковаться с чем-то новым, вы немедленно интегрируете эту информацию в свою базу знаний, если вы не будете практиковаться, вы забудете и не добьетесь прогресса.
Поделись этим постом!
Использование puts в Ruby : CodesDope
Я предполагаю, что вы ознакомились с разделом введения и знаете, как писать и компилировать коды Ruby.
Теперь давайте напечатаем что-нибудь на экране с помощью Ruby:
поместит "Hello World!"
Вывод
Привет, мир!
И готово.
Это очень просто. Не так ли?
Давайте напечатаем что-нибудь еще:
ставит «Я хочу Ruby» ставит "Рубин Руби Руби" пишет: «Программирование — это весело»
Результат
Я хочу Ruby
Ruby Ruby Ruby
Программирование — это весело
Да, это просто. Вам просто нужно написать материал, который вы хотите напечатать на экране между ( » » ) после ставится и все готово.
Давайте сделаем что-нибудь более продвинутое
x = 10 ставит «Значение x равно # {x}»
Вывод
Значение x равно 10
Я надеюсь, вы поняли это только на примере, но позвольте мне еще раз объяснить вам это.
x = 10 : Это означает, что мы берем переменную x и присваиваем ей значение 10.
помещает «Значение x равно #{10}»
#{x} : Обратите внимание, что вместо #{x} на экране было напечатано значение x , то есть 10.
Это потому, что все, что мы пишем в « #{} «, сначала оценивается, а затем печатается его значение. на экране.
Посмотрите еще несколько примеров, чтобы понять это:
x = 10 у = 5 ставит «Сумма #{x} и #{y} равна #{x+y}»
Результат
Сумма 10 и 5 равна 15
Как обсуждалось ранее, x = 10 означает, что мы берем переменную x и присваиваем ей значение 10.
Таким же образом,
y = 5 означает, что ‘y’ равно 5.
print «Сумма #{x} и #{y} равна #{x+y}» : Здесь нет ничего особенного с » суммой «, так что это было напечатано как есть. Вместо #{x} и #{y} соответствующие значения x и y были напечатаны соответственно.
И вместо #{x+y} было напечатано 15. Как я упоминал ранее, все, что мы пишем в пределах #{} , оценивается в первую очередь. Итак, x+y вычислено первым
x равно 10
y равно 5
Итак, x+y эквивалентно 10+5, т.е. 15.
Итак, 15 было напечатано на экране.
х = 10 у = 5 ставит «Произведение #{x} и #{y} равно #{x*y}»
Выход
Сумма 10 и 5 равна 50
Давайте повеселимся
ставит "."*10
Вывод
……….
ставит «Веселье»*3
Вывод
FunFunFun
Приведенный выше код должен означать «Веселье»+»Веселье»+»Веселье». Итак, давайте попробуем так:
ставит "Коды"+"Допинг"
Output
CodesDope
Да, это довольно просто. Имейте в виду, что эти вещи очень полезны в реальном программировании.
Давайте проанализируем ошибки
Эта часть предназначена только для того, чтобы научить вас, как узнать ошибку, если она возникает.
Что, если мы наберем это:
поместите "CodesDope"
Здесь мы пытаемся научить вас, как исправить ошибку, если она у вас есть.
a.rb:1:in `
Вы имели в виду? ставит
путц
a.rb:1: -> a.rb — это просто имя файла. Оно будет таким же, как ваше имя файла.
:1: — строка, в которой произошла ошибка. В нашем коде ошибка в строке 1.
неопределенный метод `put’ для main:Object (NoMethodError) : put ничего не значит для нашей программы, поэтому мы получили эту ошибку.
Вернитесь к своему коду и к этой строке и исправьте ошибку, изменив put на puts .
В будущем при написании длинных кодов убедитесь, что вы запускаете свой код время от времени во время написания вместо того, чтобы завершать весь код и запускать его в конце. Это облегчит отладку вашего кода, если вы допустили какие-то ошибки.