Откуда берется функция pretty_print, если я выведу Array в Ruby

Я играю с прай и бью то, что меня смущает.

irb
pry
cd Array

pry(Array):>

show-method возвращает:

def pretty_print ...
def pretty_print_cycle ...

Где эти методы? Я посмотрел на ruby ​​Array из документа Ruby Array и не могу найти методы. Я пошел искать массив в проекте github ruby и увидел Array.c и не могу найти Array.rb. Даже тогда я не могу найти pretty_print в Array.c.

Может кто-нибудь помочь мне понять?

Спасибо!

2 ответа

Решение

Попробуй это:

[].method(:pretty_print).source_location
=> ["/home/joel/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/pp.rb", 328]

Кажется, show-method дает такую ​​же информацию:

show-method [].pretty_print

From: /home/joel/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/pp.rb @ line 328:
Owner: Array
Visibility: public
Number of lines: 7

def pretty_print(q)
  q.group(1, '[', ']') {
    q.seplist(self) {|v|
      q.pp v
    }
  }
end

pry.rb требует pp:

https://github.com/pry/pry/blob/dd2d9b927b0afbe4e5463ff1558c566abbdb0473/lib/pry.rb

Эти методы не по умолчанию Array реализация. Попробуйте, например, [].pretty_print в irb и вы получите ошибку. Вывод состоит в том, что pry добавляет эти методы к Array, В Ruby можно добавлять новые методы к существующим классам и объектам, даже встроенным, например (в irb):

> arr = [0,1,2]
> arr.pretty_print
NoMethodError: undefined method `pretty_print' for [0, 1, 2]:Array

> class Array
>   def pretty_print
>     "*** #{inspect} ***"
>   end
> end
> arr.pretty_print
 => "*** [0, 1, 2] ***"
Другие вопросы по тегам