为什么File.read(' / path / to / file')不在Ruby文档中?

时间:2016-12-14 18:05:54

标签: ruby

为什么File.read方法在http://ruby-doc.org/core-2.3.3/File.html明确存在时未记录:

$ irb
irb(main):001:0> File.read('readme.md')
=> "hello world"

3 个答案:

答案 0 :(得分:8)

记录在案:

http://ruby-doc.org/core-2.3.3/IO.html#method-c-read

该方法继承自IO

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

答案 2 :(得分:4)

更容易:

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

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

如果存在,括号内的类或模块是定义方法的位置。

对于类方法,语法为Class.method

对于实例方法,语法为Class#method

所以#<Method: File(IO).read>表示read是一种类方法,在IO中定义,可供File类使用。

对于已在纯Ruby(而不是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