为什么File.read
方法在http://ruby-doc.org/core-2.3.3/File.html明确存在时未记录:
$ irb
irb(main):001:0> File.read('readme.md')
=> "hello world"
答案 0 :(得分:8)
答案 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