почему method_missing вызывает каждый раз, когда я пытаюсь выполнить команду? [Дубликат]

Мы также можем использовать dplyr.

Во-первых, некоторые данные:

df <- data.frame(x = rep(1:6, rep(c(1, 2, 3), 2)), year = 1993:2004, month = c(1, 1:11))

Теперь число:

library(dplyr)
count(df, year, month)
#piping
df %>% count(year, month)

Мы также можем используйте немного более длинную версию с трубкой и функцию n():

df %>% 
  group_by(year, month) %>%
  summarise(number = n())

или функцию `tally:

df %>% 
  group_by(year, month) %>%
  tally()
13
задан Tom De Leu 24 January 2012 в 20:47
поделиться

1 ответ

puts является синонимом $stdout.puts. $ stdout - это класс IO, поэтому посмотрите на документацию для IO.puts :

Записывает данные объекты в ios, как при печати IO #. Записывает разделитель записей (как правило, новую строку) после тех, которые еще не заканчиваются последовательностью новой строки. Если вызывается с аргументом массива, записывает каждый элемент в новую строку.

Это означает, что метод puts предназначен для записи нескольких строк вывода. Таким образом, он пытается вызвать метод to_ary для объекта и если to_ary определен, затем печатает каждый элемент возвращенного Array в новой строке, иначе puts вызывает метод to_s.

to_ary внутреннее использование в документации Ruby действительно недостаточно хорошо документировано (Matz указывает на это в книге языка программирования Ruby ).

Методы print и p, с другой стороны, не вызывают to_ary, только to_s.

Sidenote : Интересно, что to_ary должен возвращать реальный Array, а не объект, определяющий метод each или что-то еще:

class Test
  def to_ary
    10.downto(1)
  end
end

puts Test.new

#TypeError: can't convert Test to Array (Test#to_ary gives Enumerator)
#        from (irb):28:in `puts'
#        from (irb):28:in `puts'
#        from (irb):28
16
ответ дан Aliaksei Kliuchnikau 21 August 2018 в 08:39
поделиться
  • 1
    Благодарю. Я думаю, что суть «внутреннее использование« to_ary »действительно недостаточно хорошо документирована в документации Ruby». :) Я просто прочитал документы IO.puts, они явно не упоминают to_ary, это должно быть яснее, я думаю. Спасибо, что указали на «Язык программирования Ruby». книга, может проверить это. – Tom De Leu 22 January 2012 в 14:01
Другие вопросы по тегам:

Похожие вопросы: