如果我在Ruby中使用数组,那么pretty_print函数会从哪里来

时间:2014-07-24 23:28:04

标签: c ruby arrays pry

我正在玩撬,并打了一些令我困惑的东西。

irb
pry
cd Array

pry(Array):>

show-method返回:

def pretty_print ...
def pretty_print_cycle ...

那些方法在哪里?我从Ruby Array doc查看了ruby数组,但找不到方法。我去了search for array in github ruby project并看到了Array.c并找不到Array.rb。即使这样,我也无法在Array.c中找到pretty_print。

有人可以帮我理解吗?

谢谢!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

这些方法不在默认的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] ***"