Ruby基本文法まとめ


必要に応じて都度追記

## 必須資料
- Ruby言語 ミニマム
    - http://i.loveruby.net/ja/rhg/book/minimum.html
- Rubyコーディング規約
    - http://shugo.net/ruby-codeconv/codeconv.html
- リファレンスマニュアル
    - http://docs.ruby-lang.org/ja/2.1.0/doc/index.html
- 組み込みライブラリ一覧
    - http://docs.ruby-lang.org/ja/2.1.0/library/_builtin.html

## Rubyの特徴
- 実行ファイルの拡張子が「.rb」
- 文法がシンプルで直感的。
- 扱う対象全てがオブジェクト。
    - 文字列はStringクラスのメソッド、配列はArrayクラスのメソッド、、、等
- コンパイル言語と比較して型安全性が低い。
- 標準の組み込みライブラリが充実している
    - HTTPクライアントならnet/http、ベンチマークならbenchmark、ユニットテストならminitest、JSONならjson....etc
- ユーザによるメモリ管理が不要。不要となったオブジェクトはインタプリタに組み込みのGCが勝手に回収してくれる。
- モジュールによるMix-in機能を持つ。

## 基本概念の理解
- オブジェクト
    - データとメソッドを持つ
    - オブジェクトが持つメソッドは「オブジェクト.メソッド」というドット(.)区切りで表される。
    - オブジェクトはidを持っており、オブジェクト名.object_idで確認可能
- 変数とは
  - データの入れ物
  - 「変数名 = 値」で代入可能。
  - 数字始まり、ローマ字、日本語等はNG
    - 1name
    - namae
    - 名前

## 基本文法
- 文末にセミコロンを付けない
- インデントを適宜行う。インデント幅2。スペースのみ、タブは使用しない。(環境によりタブ幅が異なるため)
- 空行
    - 複数のクラス定義がある場合、各class定義の間は1行あける
- 命名規則
    - クラス、モジュール名
        - CamelCase。各単語の最初は大文字とする。_は使わない。
        - 例外としてHTTPやXML等の大文字の固有名詞はそのまま表す。
            - 例) ◯ ExampleClass、HTTPClient
            - 例) × Example_class、Exampleclass、HttpClient
    - メソッド名
        - 英小文字のsnake_case。
            - 例) ◯ add_something
            - 例) × addSomething、Add_something
        - 真偽を表す場合は、動詞または形容詞に?をつける。形容詞にis_はつけない。
            - 例) ◯ visible?
            - 例) × is_visible、is_visible?
        - 破壊的なメソッドを表す場合は、末尾に!を付ける。
            - 例) split  #非破壊的メソッド
            - 例) split! #破壊的メソッド
        - 「末尾に!がつくメソッドは破壊的メソッド」だが「!がなければ破壊的メソッドではない」わけではない。間違えやすいので要注意。
            - 例)concat等
            - !付きでない破壊的なメソッドは以下参考  
                http://goo.gl/aM1Sci
    - 定数
        - 大文字のsnake_case
            - 例) ◯ EXAMPLE_CONSTANT
    - 変数
        - 基本的に、英小文字 or _始まり のsnake_caseを使う。
            - 例) local_variable
        - グローバル変数の場合は、頭に$をつける
            - 例) $global_variable
        - インスタンス変数の場合は、頭に@を付ける。
            - 例) @variable
        - クラス変数の場合は、頭に@@を付ける。
            - 例) @@variable
- 文字列
    - ダブルクォーテーション、シングルクォーテーションどちらかで囲む。
- 真偽
    - 偽はfalseとnilのみ
    - それ以外は真。0も空白(" ")も真
- 配列
    - インデックスは0始まり
    - [式,式,式]で配列生成
    - 配列アクセスは、配列[インデックス]
- ハッシュ(連想配列)
    - {key1 => val1, key2 => val2 }でハッシュ生成
    - ハッシュ[key]でアクセス
    - この時、文字列で入力する場合はkey,valueともに""で囲む事。忘れがち
- シンボル
    - コロン(:)で始まる文字列
        - 例):include 
    - 文字列に似たオブジェクトで、ハッシュキーなど簡単な文字列参照等では、以下の理由から文字列オブジェクトの代わりによく使われる。
        - 可読性が高い
        - 新たにオブジェクトを生成しないのでメモリの節約になる
- メソッド
    - インスタンスメソッド
        - レシーバがインスタンスのメソッド
        - アクセサメソッド
            - インスタンス変数への参照、更新を行うためのインスタンスメソッド。
            - 以下3種類のみ存在する。
                - attr_accessor   　　#インスタンス変数の参照、更新が可能
                - attr_reader      　　#インスタンス変数の参照のみ可能
                - attr_writer       　　#インスタンス変数の更新のみ可能
        - initializeメソッド
            - オブジェクト生成後にインスタンスの初期化を行うためのインスタンスメソッド。定義しなくても可(初期化されないだけ)
            - コンストラクタ
    - クラスメソッド
        - クラスをレシーバとして呼び出せるメソッド
        - newメソッド
            - オブジェクト生成のためのクラスメソッド。生成後にインスタンスメソッドinitializeで初期化される。
    - モジュールメソッド
    - 特異メソッド
- ブロック
    - 基本的にdo...endを使用する。
- 演算
    - 基本演算
        - puts 7+5  =>12
        - puts 7*5   =>35
        - puts 7/5   =>1　#商
        - puts 7%5 =>2  #余り
    - 代入
        - 多重代入
            - a,b = 1,2
        - 自己代入  
            - 以下は同じ意味
                - num = num + 1
                - num += 1
            - 以下は同じ意味
                - b ||= 2
                - b = b || 2
        - %記法
            - %w(Alice Bob Chrlie) # => ["Alice", "Bob", "Chrlie"]
- 条件分岐
    - if～elseif～else end
    - unless ～
    - case           #if文は上から舐めていくがcaseは目的の箇所にジャンプできるので早い。
- ループ
    - for i in 1..100 do...
    - while xxxx do...
    - オブジェクト名.each do |value|
- 論理演算子
    - && かつ
    - || または

## よく使う組み込みイブラリ
- 文字列(String)
    - 文字列置換（正規表現で指定した条件を抽出）
        - str.gsub(/at/,"@")   #gsubは該当する全ての要素を置換する(atatatなら@@@に変換)
        - str.sub(/at/,"@")     #subは最初の要素だけ置換する(atatatなら@atatに変換)
    - 末尾改行文字を除外（特定文字の除外も可能）
        - str.chomp
        - str.chomp(":") #:で改行する場合
    - 大文字、小文字変換
        - "abcde".upcase   　　　 #=> "ABCDE"
        - "ABCDE".downcase　　 #=> "abcde
    - 指定文字列で文字列全体を分割、配列にする
        - "Alice Bob Charlie".split(" ")   #=> ["Alice", "Bob", "Charlie" ]
        - "Alice,Bob,Charlie".split(",")   #=> ["Alice", "Bob", "Charlie" ]
    - 指定した文字列を含んでいるか確認
        - "abcde".include?("bc")   #=> true
        - "abcde".include?("zy")   #=> false
    - 指定した文字列を含んでいれば、その開始位置を返す、存在しなければnilを返す
        - "abcde".index("a")    # index=0
        - "abcde".index("c")    # index=2
        - "abcde".index("abc") # index=0
        - "abcde".index("z")    # index=nil
    - 文字列の一部抽出
        - "abcde"[0]               #=> a
        - "abcde"[0,３]           #=> abc      ※index0から3文字目まで
- 配列(Array)
    - 配列の要素数を確認
        - [].length         #=> 0
        - [1,2,3].length #=> 3
        - [1,2,3].size     #=> 3
    - 文字列への変換
        - ary.to_s
    - 配列要素の中で最大値、最小値を求める
        - [1,3,7,2,5].max   #=> 7
        - [1,3,7,2,5].min    #=> 1
    - 配列要素の末尾から指定要素分だけ削除
        - ary = [1,3,7,2,5]
        - ary.pop               #=> 5                    ※引数指定の場合は末尾1文字だけ取得、配列からは削除
        - ary                     #=> [1,3,7,2]
        - ary.pop(2)          #=> [7,2]               ※引数指定の場合は指定要素分だけ取得、配列からは削除
        - ary                     #=> [1,3]
    - 配列が空かどうかの確認
        - [].empty?         #=> true
        - [1,2,3].empty? #=> false
    - 配列要素の中で、指定した特定要素を含むか確認
        - [1,2,3].include?(1)    #=> true
        - [1,2,3].include?(10)  #=> false
    - 末尾に要素追加
        - [1,2,3] << 4    #=> [1,2,3,4]
    - 先頭に要素追加
        - [1,2,3] .unshift(0)  #=>[0,1,2,3]
    - 先頭要素の削除
      - ary=[0,1,2,3]
      - ary.shift  #=> 0
      - ary  #=>[1,2,3]
        - [1,2,3] .unshift(0)  #=>[0,1,2,3]
    - ランダムに要素取得
        - [1,3,7,2,5].sample   #=> 5  ※結果は毎回ランダムで選ばれる。
    - 配列の複製
        - tmp = self.dup
    - 指定したインデックスの要素の削除 ※破壊的メソッド
        - ary = [0,1,2,3]
        - ary.delete_at(2) =>2
        - ary   #=> [0,1,3]
- 数値(Fixnum)
    - 絶対値を取得
        - (-1).abs          #=> 1
- 浮動小数値(Float)
    - 小数値を特定桁で四捨五入
        - (2.58926).round(2)  #=> 2.59
    - 少数値を特定行で切り上
        - (2.42).ceil
- IO
    - io#gets

##参考
- 以外に忘れられている便利なメソッド
    - http://ruby-rails.hatenadiary.com/entry/20150101/1420049679
- よく使うString型のメソッド  
    - http://qiita.com/shizuma/items/67650b1a22f8be1d7fc0