#ruby
#ruby
Вопрос:
Просто из любопытства, что означает «p» в enumerable.each_slice в Ruby?
Например:
(1..3).each_slice(2) {|n| p n}
С принтами:
[1, 2]
[3]
и
(1..3).each_slice(2) {|n| print n}
С принтами:
123
в то время как:
(1..3).each_slice(2) {|n| puts n}
С принтами:
1
2
3
Ответ №1:
Нет никакого волшебства или странного поведения, p на самом деле относится к Kernel.p
each_slice выполняет итерацию для фрагмента из 2 элементов. Итак:
итерация 1 -> n = [1, 2] итерация 2 -> n = [3]
Ядро #p записывает n.inspect на каждой итерации, поэтому оно записывает строки [1, 2], а затем [3], за каждой из которых следует новая строка.
Ядро #print записывает n, за которым следует значение $, (разделитель полей, который по умолчанию равен нулю), поэтому оно записывает [1, 2] и сразу же записывает [3]
И, наконец, Kernel#puts рекурсивно записывает каждый массив, за которым следует новая строка. Более подробная информация об этом здесь: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/227540
Комментарии:
1. Я рекомендую вам перейти по этой ссылке, в ней есть более интересные вещи.
2. Интересное чтение. Последний пункт комментатора в этом электронном письме можно упростить до
a.flatten.join("")
.
Ответ №2:
Это вызов метода Kernel#p
.
[it] напрямую записывает
obj.inspect
, за которым следует разделитель записей текущего вывода, в стандартный вывод программы.