

Rubyの仕組みを初歩から勉強中の者です。

<http://docs.ruby-lang.org/ja/2.1.0/class/File.html>

この中からreadメソッドを調べる場合はどうしたらいいですか？

特異メソッドというのはありますが、特異じゃないメソッドはどこにありますか？


CC BY-SA 3.0
2015-02-02T06:56:00.107
5755
2015-02-02T22:49:38.193
2015-02-02T21:45:45.250
85
8025
question
ruby
Ruby - File.read() メソッドの説明をAPIドキュメントで調べたい


`File.read`は親クラスの`IO`で定義されてるメソッドですので

<http://docs.ruby-lang.org/ja/2.1.0/method/IO/s/read.html>

から参照できます。

ちなみに `File.ancestors`で親クラスの一覧を表示できます。

[code]

    pry(main)> File.ancestors
    => [File, IO, File::Constants, Enumerable, Object, PP::ObjectMixin, Kernel, BasicObject]
    
[/code]


CC BY-SA 3.0
2015-02-02T07:04:01.857
5756
2015-02-02T22:49:38.193
2015-02-02T22:49:38.193
85
3271
5755
answer


「継承」という概念の理解が必要になります。  
質問が2つありますが、勉強中との事なので簡単に。。。

## Q1: File.read() のマニュアルはどこ？

探し方です。

  1. <http://docs.ruby-lang.org/ja/2.1.0/class/File.html> を見て read が見つからない
  2. 上記のページの先頭部分に以下の記述があります。  
  

    * クラスの継承リスト: File < IO < Enumerable < File::Constants < Object < Kernel < BasicObject
  

  3. 末端の File で見つからなかったので「上位」の「IO」をクリック
  4. そこでも見つからなければ更に上位の Enumerable をクリック...(後は見つかるまで続けます)

## Q2: 特異じゃないメソッドはどこに？

特異じゃないメソッドは「インスタンスメソッド」と呼びます。  
ご提示のページだと、atime や chmod などが該当しますね。

勉強、頑張ってください(^^)


CC BY-SA 3.0
2015-02-02T07:31:35.190
5762
2015-02-02T07:31:35.190
7208
5755
answer


`read`は[`File`クラス](http://docs.ruby-
lang.org/ja/2.1.0/class/File.html)のものではありません。`read`は[`IO`クラス](http://docs.ruby-
lang.org/ja/2.1.0/class/IO.html)から継承して引き継がれているメソッドなので、[`File`クラス](http://docs.ruby-
lang.org/ja/2.1.0/class/File.html)ではなく[`IO`クラス](http://docs.ruby-
lang.org/ja/2.1.0/class/IO.html)のページを探してください。

**追記** : ご存知でしたらすみません。

[`IO`クラス](http://docs.ruby-
lang.org/ja/2.1.0/class/IO.html)のページを見ると、`read`の項目が二つあることに気づかれると思います。これらは名前は同じですが、別のメソッドです。

Rubyには`read`が二種類あります。[特異メソッドの`read`](http://docs.ruby-
lang.org/ja/2.1.0/method/IO/s/read.html)と[インスタンスメソッドの`read`](http://docs.ruby-
lang.org/ja/2.1.0/method/IO/i/read.html)です。二者を区別するため、前者を[`IO.read`](http://docs.ruby-
lang.org/ja/2.1.0/method/IO/s/read.html)、後者を[`IO#read`](http://docs.ruby-
lang.org/ja/2.1.0/method/IO/i/read.html)という風に書き分ける慣習があります。

[`IO.read`](http://docs.ruby-
lang.org/ja/2.1.0/method/IO/s/read.html)の方は、ファイル名を渡すとその場で内容をまるごと読み込むものです。  
`text = IO.read("hogehoge.txt")` のように使います。  
ややこしいことに、`File`は`IO`を継承しているので、`text =
File.read("hogehoge.txt")`と書いても問題なく動きます。(おそらくこれがmirukaさんのもともと調べたかったことだと思います)

[`IO#read`](http://docs.ruby-
lang.org/ja/2.1.0/method/IO/i/read.html)の方は、すでに開いたファイルの内容を読み込むものです。  
`open('hogehoge.txt') {|f| text = f.read }` のように使います。  
(詳細なオプションは割愛します)

参考: [なぜ File.read() でなくて IO.read()
なのか?](http://d.hatena.ne.jp/kwatch/20080924/1222268571)


CC BY-SA 3.0
2015-02-02T08:12:18.783
5767
2015-02-02T09:55:50.603
2015-02-02T09:55:50.603
5910
5910
5755
answer


シェルから `ri` を使って調べられます。

[code]

    ri File.read
    
[/code]

出力:

[code]

    = File.read
    
    (from ruby core)
    === Implementation from IO
    ------------------------------------------------------------------------------
      IO.read(name, [length [, offset]] )   -> string
      IO.read(name, [length [, offset]], open_args)   -> string
    
    ------------------------------------------------------------------------------
    
    Opens the file, optionally seeks to the given offset, then returns length
    bytes (defaulting to the rest of the file).  read ensures the file is closed
    before returning.
    
    [...snip...]
    
    (from ruby core)
    === Implementation from IO
    ------------------------------------------------------------------------------
      ios.read([length [, outbuf]])    -> string, outbuf, or nil
    
    ------------------------------------------------------------------------------
    
    Reads length bytes from the I/O stream.
    
    [...snip...]
    
[/code]

"Implementation from IO" と書かれているので、`IO`
から継承されたメソッドであることが分かります。(前者がクラスメソッド、後者がインスタンスメソッドの説明です。)


CC BY-SA 3.0
2015-02-02T16:39:57.523
5800
2015-02-02T16:39:57.523
76
5755
answer


`File.read`は`IO`クラスのメソッドなので、`IO`クラスのAPIドキュメントを調べましょう。

<http://docs.ruby-lang.org/ja/2.1.0/class/IO.html#S_READ>

・・・が答えになるのですが、初心者の方はそもそも「どうやったら`IO`クラスのメソッドってわかるの？？」となると思います。

以下にRubyのメソッドの定義場所を調べる方法をいくつか紹介しておきます。

### irb + methodを使う

irbから次のように打ち込むと、`IO`クラスのメソッドであることが予想できます。

[code]

    > File.method(:read) 
    => #<Method: File(IO).read>
    
[/code]

ちなみにgemのメソッドであれば、次のようにするとどこにコードがあるのかもわかります。（ただし、`File.read`のように、C言語実装の場合は`nil`になります。）

[code]

    > User.method(:find).source_location 
    => ["/Users/jit/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/activerecord-4.0.8/lib/active_record/querying.rb", 1]
    
[/code]

参考:
[Rubyでメソッドの定義場所を見つける方法](http://qiita.com/jnchito/items/fc8a61b421d026a23ffe)

### pry + pry-docを使う

pryとpry-docをインストールすると、`? File.read`や`$ File.read`でドキュメントやソースコードを確認できます。

[code]

    $ gem install pry pry-doc
    $ pry               
    [1] pry(main)> ? File.read
    
    From: io.c (C Method):
    Owner: #<Class:IO>
    Visibility: public
    Signature: read(*arg1)
    Number of lines: 29
    
    Opens the file, optionally seeks to the given offset, then returns
    length bytes (defaulting to the rest of the file).  read
    ensures the file is closed before returning.
    
    If the last argument is a hash, it specifies option for internal
    open().  The key would be the following.  open_args: is exclusive
    to others.
    
    encoding::
      string or encoding
    
      specifies encoding of the read string.  [32mencoding[0m will be ignored
      if length is specified.
    
    mode::
      string
    
      specifies mode argument for open().  It should start with "r"
      otherwise it will cause an error.
    
    open_args:: array of strings
    
      specifies arguments for open() as an array.
    
    Examples:
    
      IO.read("testfile")           #=> "This is line one\nThis is line two\nThis is line three\nAnd so on...\n"
      IO.read("testfile", 20)       #=> "This is line one\nThi"
      IO.read("testfile", 20, 10)   #=> "ne one\nThis is line "
    [2] pry(main)> $ File.read
    
    From: io.c (C Method):
    Owner: #<Class:IO>
    Visibility: public
    Number of lines: 24
    
    static VALUE
    rb_io_s_read(int argc, VALUE *argv, VALUE io)
    {
        VALUE opt, offset;
        struct foreach_arg arg;
    
        argc = rb_scan_args(argc, argv, "13:", NULL, NULL, &offset, NULL, &opt);
        open_key_args(argc, argv, opt, &arg);
        if (NIL_P(arg.io)) return Qnil;
        if (!NIL_P(offset)) {
        struct seek_arg sarg;
        int state = 0;
        sarg.io = arg.io;
        sarg.offset = offset;
        sarg.mode = SEEK_SET;
        rb_protect(seek_before_access, (VALUE)&sarg, &state);
        if (state) {
            rb_io_close(arg.io);
            rb_jump_tag(state);
        }
        if (arg.argc == 2) arg.argc = 1;
        }
        return rb_ensure(io_s_read, (VALUE)&arg, rb_io_close, arg.io);
    }
    
[/code]

参考:
[Rubyでメソッドの定義場所を見つける方法](http://qiita.com/jnchito/items/fc8a61b421d026a23ffe)

### RubyMineを使う

さらに、お金はちょっとかかりますが、RubyMineというIDEを使うとショートカットキー一発でメソッドの定義場所を教えてくれます。

[RubyMineのコードジャンプ機能は本当にすごい！！困ったときはCommand+Bを押すべし！](http://qiita.com/jnchito/items/bcb2bb5311a44113fdd9)

ちなみに僕はRubyMineを使っています。  
Command+Bで定義場所を見つけてくれるので超絶便利です。

自分に合った方法でメソッドの定義場所やAPIドキュメントを探せるようになってください。


CC BY-SA 3.0
2015-02-02T22:14:34.577
5808
2015-02-02T22:48:28.287
2015-02-02T22:48:28.287
85
85
5755
answer