Откуда берется функция 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] ***"