Что означает «p» в enumerator each_slice?

#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 , за которым следует разделитель записей текущего вывода, в стандартный вывод программы.