Ruby力を一段アップするために読んだほうが良い公式ドキュメント集


Rubyの言語仕様で重要なものをピックアップ。

## Class

http://www.ruby-doc.org/core-1.9.3/Class.html

RubyではClassはClassオブジェクトとして定義されている。

```:methods
::new #allocate #inherited #new #superclass
```

インスタンス化に関係する

>  ::new, #new, #allocate

と継承に関係する

>  #superclass, #inhereted

しか定義されていない。

その他のメソッドはすべてスーパークラスであるModuleに定義されている。Classはインスタンス化できるModuleと考えれば良い。

### SuperClassの関係
```bash:
[1] pry(main)> Class.superclass
=> Module
[2] pry(main)> Module.superclass
=> Object
[3] pry(main)> Object.superclass
=> BasicObject
[4] pry(main)> BasicObject.superclass
=> nil
[5] pry(main)> nil.superclass
NoMethodError: undefined method `superclass' for nil:NilClass
[6] pry(main)> NilClass.superclass
=> Object
```

### Classの関係

```bash:
[1] pry(main)> Class.class
=> Class
[2] pry(main)> Module.class
=> Class
[3] pry(main)> Object.class
=> Class
[4] pry(main)> BasicObject.class
=> Class
[5] pry(main)> nil.class
=> NilClass
[6] pry(main)> NilClass.class
=> Class
```

### Moduleも含めた祖先

```bash:
[1] pry(main)> Class.ancestors
=> [Class, Module, Object, PP::ObjectMixin, Kernel, BasicObject]
```

ここで、`PP::ObjectMixin`は`pry`が出力の整形用に勝手に突っ込んだもの。通常は入っていない。

```bash:
irb(main):001:0> Class.ancestors
=> [Class, Module, Object, Kernel, BasicObject]
```

## Module

http://www.ruby-doc.org/core-1.9.3/Module.html


```:methods
::constants ::nesting ::new #< #<= #<=> #== #=== #> #>= #alias_method #ancestors #append_features #attr #attr_accessor #attr_reader #attr_writer #autoload #autoload? #class_eval #class_exec #class_variable_defined? #class_variable_get #class_variable_set #class_variables #const_defined? #const_get #const_missing #const_set #constants #define_method #extend_object #extended #freeze #include #include? #included #included_modules #instance_method #instance_methods #method_added #method_defined? #method_removed #method_undefined #module_eval #module_exec #module_function #name #private #private_class_method #private_instance_methods #private_method_defined? #protected #protected_instance_methods #protected_method_defined? #public #public_class_method #public_instance_method #public_instance_methods #public_method_defined? #remove_class_variable #remove_const #remove_method #to_s #undef_method
```

基本機能

- 比較関係

>  #< #<= #<=> #== #=== #> #>= 

- 文字列化

>  #name #to_s

- freeze

>  #freeze

Constants関係

>  ::constants ::nesting #const_defined? #const_get #const_missing #const_set #constants #remove_const


Module機能

>  ::new　#ancestors

- autoload

>  #autoload #autoload?

- include

>  #append_features #include #include? #included #included_modules

- extend

>  #extend_object #extended


Class関係

- class_variables (`@@foo` etc.)

>  #class_variable_defined? #class_variable_get #class_variable_set #class_variables #remove_class_variable

- methods

>  #alias_method #define_method #method_added #method_defined? #method_removed #method_undefined #remove_method #undef_method

>  #instance_methods


>  #module_function


- attr

>  #attr #attr_accessor #attr_reader #attr_writer

- eval, exec

>  #class_eval #class_exec #module_eval #module_exec

private,protected,publicのスコープ概念の導入

>  #private #private_class_method #private_instance_methods #private_method_defined?

>  #protected #protected_instance_methods #protected_method_defined?

>  #public #public_class_method #public_instance_method #public_instance_methods #public_method_defined?


## Object

http://www.ruby-doc.org/core-1.9.3/Object.html

```:methods
#!~ #<=> #=== #=~ #class #clone #define_singleton_method #display #dup #enum_for #eql? #extend #freeze #frozen? #hash #inspect #instance_of? #instance_variable_defined? #instance_variable_get #instance_variable_set #instance_variables #is_a? #kind_of? #method #nil? #object_id #public_method #public_send #remove_instance_variable #respond_to? #respond_to_missing? #send #singleton_class #singleton_methods #taint #tainted? #tap #to_enum #to_s #trust #untaint #untrust #untrusted?
```

基本機能

- 比較関係

>  #!~ #<=> #=== #=~ #eql? #nil?

- 文字列化

>  #to_s #inspect

- Enum関係

>  #enum_for #to_enum #tap

- copy

>  #clone #dup

- Hash値, Object値

>  #hash #object_id

- display

>  #display

- freeze

>  #freeze #frozen?

- マーク付け

>  #taint #tainted? #untaint
>  #trust  #untrust #untrusted?

Instance機能

- classとの関係性チェック

>  #instance_of? #is_a? #kind_of? #class

- instance_valiable (`@foo` etc.)

>  #instance_variable_defined? #instance_variable_get #instance_variable_set #instance_variables #remove_instance_variable

- method check

>  #method #public_method
>  #respond_to? #respond_to_missing?

- method call

>  #send #public_send

- extend

>  #extend

- singleton_method、singleton_class

>  #define_singleton_method #singleton_class #singleton_methods

これは日本語では特異メソッド、特異クラスと呼ばれている。これの解説は以下がわかり易かった。
[結局、Rubyの特異メソッドって何なの？ - (ﾟ∀ﾟ)o彡 sasata299's blog](http://blog.livedoor.jp/sasata299/archives/51497378.html)
これを読めば、`class << self`とかの意味もわかるはず！


## BasicObject

http://www.ruby-doc.org/core-1.9.3/BasicObject.html

すべてオブジェクトで共通で使える、Objectの親に当たるクラス。Kernelモジュールがincludeされていないのが特徴。

```:methods
::new #! #!= #== #__id__ #__send__ #equal? #instance_eval #instance_exec #method_missing #singleton_method_added #singleton_method_removed #singleton_method_undefined
```

- 比較関係

>  #! #!= #== #equal? 

- eval, exec

>  #instance_eval #instance_exec

- method_missing

>  #method_missing

- singleton_methodのチェック関係

>  #singleton_method_added #singleton_method_removed #singleton_method_undefined

- その他

>  #  ::new `#__id__` `#__send__`


## Kernel

http://www.ruby-doc.org/core-1.9.3/Kernel.html

open, system, eval, exit, raise, putsなどのprint系関数, Array, Integer, Stringなどのキャストのような関数など、一般的な言語でメソッドではなく関数として定義されているような、基本的な動作が定義されているモジュール。

ここに定義されているすべてのメソッドは一度見ておくと良さそう。


## Proc/Method
http://www.ruby-doc.org/core-1.9.3/Proc.html
http://www.ruby-doc.org/core-1.9.3/Method.html

`binding`(束縛変数)を持つProcと、`receiver`を持つMethod。Blockを使う時なんかにも必要なので、理解しておくと良い。
Proc/Method, block/proc/lambdaの違いについては以下がわかり易かった。
[Ruby の Proc オブジェクトと Method オブジェクトの違い (proc, lambda, ブロック, メソッドについて) - vivid memo](http://d.hatena.ne.jp/vividcode/20100813/1281709854)


## その他、基本型

String/Symbol

- http://www.ruby-doc.org/core-1.9.3/String.html
- http://www.ruby-doc.org/core-1.9.3/Symbol.html

Number/Math

- http://www.ruby-doc.org/core-1.9.3/Fixnum.html
- http://www.ruby-doc.org/core-1.9.3/Bignum.html
- http://www.ruby-doc.org/core-1.9.3/Integer.html
- http://www.ruby-doc.org/core-1.9.3/Float.html
- http://www.ruby-doc.org/core-1.9.3/Rational.html
- http://www.ruby-doc.org/core-1.9.3/Complex.html
- http://www.ruby-doc.org/core-1.9.3/Numeric.html
- http://www.ruby-doc.org/core-1.9.3/Math.html


Boolean

- http://www.ruby-doc.org/core-1.9.3/TrueClass.html
- http://www.ruby-doc.org/core-1.9.3/FalseClass.html

集合関係

- http://www.ruby-doc.org/core-1.9.3/Enumerable.html
- http://www.ruby-doc.org/core-1.9.3/Range.html
- http://www.ruby-doc.org/core-1.9.3/Array.html
- http://www.ruby-doc.org/core-1.9.3/Hash.html
- http://www.ruby-doc.org/stdlib-1.9.3/libdoc/set/rdoc/Set.html

Time/Date

- http://www.ruby-doc.org/core-1.9.3/Time.html
- http://www.ruby-doc.org/stdlib-1.9.3/libdoc/date/rdoc/Date.html
- http://www.ruby-doc.org/stdlib-1.9.3/libdoc/date/rdoc/DateTime.html