爲什麼File.read
方法http://ruby-doc.org/core-2.3.3/File.html沒有記錄時,明顯存在:爲什麼File.read('/ path/to/file')不在Ruby文檔中?
$ irb
irb(main):001:0> File.read('readme.md')
=> "hello world"
爲什麼File.read
方法http://ruby-doc.org/core-2.3.3/File.html沒有記錄時,明顯存在:爲什麼File.read('/ path/to/file')不在Ruby文檔中?
$ irb
irb(main):001:0> File.read('readme.md')
=> "hello world"
使用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
它去更容易:
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
出色答卷埃裏克,感謝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'。 –
這是PRY非常引人注目的功能 –