2016-12-14 61 views

回答

6

使用Ruby調查:

File.methods.include? :read 
#=> true 
File.methods(false).include? :read                  
#=> false 
File.ancestors 
#=> [File, IO, File::Constants, Enumerable, Object, Kernel, BasicObject] 
IO.methods(false).include? :read 
#=> true 
3

它去更容易:

File.method(:read) 
#=> #<Method: File(IO).read> 

['array'].method(:flatten) 
#=> #<Method: Array#flatten> 

如果存在,括號之間的類或模塊中,可以定義方法的地方。

對於類方法,語法是Class.method

例如方法,語法是Class#method

所以#<Method: File(IO).read>意味着read是一種類方法,在IO中定義並且可用於File類。

對於方法已在普通紅寶石(而不是C)被定義,則可以使用Method#source_location

require 'set' 
Set.new.method(:replace).source_location 
#=> ["~/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/set.rb", 142] 

所以Set#replace是在指定的Ruby文件中定義,在管線142

如果您使用PRY作爲替代IRB,你甚至可以使用:

show-source Set#replace 
#=> 
From: /home/ricou/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/set.rb @ line 142: 
Owner: Set 
Visibility: public 
Number of lines: 10 

def replace(enum) 
    if enum.instance_of?(self.class) 
    @hash.replace(enum.instance_variable_get(:@hash)) 
    else 
    clear 
    merge(enum) 
    end 

    self 
end 
+0

出色答卷埃裏克,感謝sharing-我不知道這些技術。 [Method#owner](http://ruby-doc.org/core-2.3.3/Method.html#method-i- owner)也就是'File.method(:read).owner#=> #'和'['array']。method(:flatten).owner#=> Array'。 –

+0

這是PRY非常引人注目的功能 –

相關問題