最低限知っておきたいRubyのまとめ（Rails初心者向け）

Ruby on RailsでWebアプリケーションを作りたい人。
Rubyを一から勉強して理解するのは面倒ですよね。

RubyとRailsは別物とも言われます。実際問題、Rubyを理解していなくてもRailsで動くアプリケーションを作ることはできます。（Railsはそれほど強力なツールであるということです。）

しかし！RailsはRubyで書かれていますので、コードを読み解き、動きを理解するのにRubyの知識は必要です。

今回はそんなRails上達の一歩目として最低限知っておきたいRubyの知識をまとめました。

---
##Rubyとはどういう言語か
Rubyがどういう言語であるかを表現するキーワード

**オブジェクト指向** : *オブジェクト*間の相互作用でシステムの振る舞いを捉える考え方。
すべてのオブジェクトはなんらかのclassに属し、classに定義されたメソッドを呼びだして処理を行うことができる。
オブジェクト指向に関しては様々な議論があるので、興味のある人は調べてみてください。

**スクリプト言語** : 人間の扱う言語（英語）のように記述できる軽量言語。コンパイル（機械語への翻訳）せずに実行できる。RubyのほかにPython, PHP, Perl, JavaScriptなどがある。

**動的言語** : 実行時にプログラムを一文ずつ処理する。ユーザーの入力に応じて処理を分岐させたりすることが可能となる（クラス定義を分岐させたり）。コンパイラ言語だとコンパイル時にクラスやメソッドの定義が行われる。


##Rubyで扱える主なデータ型(組み込みクラス)
組み込みクラスのオブジェクトには様々便利なメソッドがあらかじめ準備されています。Railsを使いこなすためにどのようなクラスにどのようなメソッドが呼び出し可能かを把握しましょう。
###文字列 String Class
'あるいは"で囲われた文字の列。"の中では#{...}を用いた式展開が可能。
文字列は+で結合することが可能。

```ruby:string.rb
name = "Ruby"
p 'Hello world! #{name}' => 'Hello world! #{name}'
p "Hello world! #{name}" => "Hello world! Ruby"

greet = "Hello "
person = "Taro"
p greet + person  => "Hello Taro"
```


###数値 Numeric Class
数値を扱う。
サブクラスにInteger, Floatがある。
Integerは整数を扱い、Floatは浮動小数点数を扱える。
数値クラスのオブジェクトはto_sメソッドを用いることで文字列に変換できる。（逆に文字列で表された数値はto_iメソッドでIntegerに変換できる。）

###配列 Array Class
Array Classでは、複数のオブジェクトを保持する配列が扱える。
配列は[]で囲い、オブジェクトを,で区切ることによって複数のオブジェクトを保持できる。配列内のオブジェクトは要素の番号で参照することができる。

```ruby:array.rb
a = ["taro", "hanako", "jiro"]
p a[0] => "taro"
```
配列の要素の内容を書き換えたり、要素を追加する方法もあるので、詳しくはドットインストールなどを参照してください。

###ハッシュ
配列では、要素のオブジェクトを配列の番号で呼びだすことで要素を参照することができましたが、ハッシュオブジェクトでは要素を参照する名前をつけることができます。

```ruby:hash.rb
h = {:key1 => "value1", :key2 => "value2", :key3 => "value3" }
p h[:key1] => "value1"
```


##メタプログラミング
Rubyは非常に自由度が高い言語であるため、より抽象的なプログラムを書くことによって組み込みクラスの定義をいじったり、様々なことができます。
###class
すべてのオブジェクトはなにがしかのクラスに属しています。
オブジェクトは属するクラスに定義されたメソッドを呼びだすことができます。
upcase というメソッドはStringクラスに予め定義された文字をすべて大文字にするメソッドですが、これはIntegerクラスには定義されていないため、Integerクラスに属するオブジェクトが呼び出そうとするとNoMethodErrorが呼び出されます。

```ruby:meta.rb
str = "hello world"
num = 1200
p str.upcase => "HELLO WORLD"
p num.upcase => NoMethodError...
p num.to_s.upcase => "1220"
```

しかし、上の記述のように、Integerクラスのnumをto_sメソッドによって文字列にすることでupcaseメソッドを呼び出すことができます。

###classの定義
クラスは組み込みクラスを利用する他に、自分で新たなクラスを定義することもできます。これによってプログラミングの幅が格段に開けます。
では実際に自分で新しいクラスを作ってそこにメソッドを定義してみます。

```ruby:new_class.rb
class Animal  #頭文字は大文字
  def initialize(name) #オブジェクトを初期化
    @name = name
  end

  def greet(person)
    puts "Hello " + person
  end
end
```
ここでAnimalクラスが定義できました。
Animalクラスにオブジェクトをつくると、定義されているgreetメソッドを呼び出すことができます。

```ruby:
taro = Animal.new("taro")
p taro.greet("Hanako")
=> "Hello Hanako"
```

###クラスの継承
クラスの継承によって、新たに定義するクラスに継承したクラスのメソッドを呼び出せる力を与えることができます。

上で定義したAnimalクラスではgreetというメソッドを定義しましたので、Animalクラスに属するtaro君はgreetメソッドを呼び出すことができました。

ここでAnimalクラスを継承したHumanクラスを定義してみましょう。

```ruby:new_class.rb
class Animal  #頭文字は大文字
  def initialize(name) #オブジェクトを初期化
    @name = name
  end

  def greet(person)
    puts "Hello " + person
  end
end

class Human < Animal  #継承したいクラスは<で書く。
  def bye(person)
    puts "Bye " + person
  end
end
```
これでAnimalクラスを継承したHumanクラスが定義できました。継承したクラスをSuperClassといいます。

ではHumanクラスのオブジェクトを作ってメソッドを呼び出してみましょう。

```ruby:
taro = Animal.new("taro")
jiro = Human.new("jiro")
taro.greet("hanako")  =>  "Hello hanako" 
jiro.greet("taro")    =>  "Hello taro"
jiro.bye("taro")      =>  "Bye taro"
taro.bye("jiro")      =>  #undefined method 'bye' for #<Animal...
```
このように、Animalクラスを継承しているHumanクラスのjiroはgreet,byeメソッドのどちらも呼び出すことができます。
一方Animalクラスにはbyeメソッドが定義されていないためtaroはbyeメソッドを呼び出すことができません。

##変数とスコープ

この項ではRubyで使っていく変数の種類とそのスコープについて説明していきます。
スコープとはある変数を参照できる範囲で、例えばメソッドの中で宣言されたローカル変数をメソッドの外から参照することはできません。

###ローカル変数
ローカル変数とは英小文字あるいは_から始まる変数です。
ローカル変数のスコープはクラス、モジュール、メソッド定義の中です。すなわち、クラス定義の中で宣言されたローカル変数はそのクラスの中から参照可能であるということになります。

###インスタンス変数
@ではじまる変数がインスタンス変数です。
インスタンス変数は特定のオブジェクトに属し、そのクラス内あるいはサブクラスのメソッドから参照可能です。

###クラス変数
@@で始まる変数がクラス変数です。クラス変数はクラス定義の中で宣言されることで利用可能となります。

クラスの特異メソッド、インスタンスメソッドからの参照、代入が可能です。
クラスを継承した子クラスで同じ名前のクラス変数が宣言されるとその値が上書きされてしまうため注意が必要です。

##基本構文
Rubyは非常にシンプルな構文を備えています。
###関数定義
簡単に、なにか与えた言葉を表示する関数を定義してみましょう。

```ruby:
def say(something)
  puts something
end

say("Hello")  =>  Hello
```

このように、関数はシンプルに記述することができます。
関数に引数をあたえることで、関数が呼び出されるときにその引数を使うことができます。関数はクラスに属するオブジェクトが自分の属するクラスに定義されたものを呼び出すことができます。
関数定義内で、オブジェクトに保持させることのできるインスタンス変数を宣言することができます。
※


###条件分岐
条件によって操作を分岐させたいときに便利なのが以下の条件分岐構文です。
ネストして書くことも可能ですが、あまりに多用しすぎるとこんがらがって難解なコードになってしまうので気をつけて活用しましょう。
####if文

```ruby:
def assess(point)
  if point > 80  
    puts "Good :)"  #pointが80より大き位場合の処理
  elsif point >60
    puts "soso..."  #pointが80以下60より大きい場合の処理
  else
    puts "Not good :("  #pointが60以下の処理
  end
end

assess(90)  =>  "Good :)"
assess(70)  =>  "soso..."
assess(50)  =>  "Not good :("
```
このように、if文を用いて与えられた情報を判断して、条件に合わせた処理を行うことができます。

####case文
if文の他に条件に合わせて処理を変えたいときにcase文を使うこともできます。caseぶんはあるオブジェクトに対してその値に関して条件分岐をさせるのに向いています。
case文は次のように記述します。

```ruby:
animal = 'dog'
case animal
when 'dog'
puts "ワン"
when 'cat'
puts "ニャン"
when 'human'
puts "Hi!"
else
puts "can't judge"
end

=> 'ワン' #出力
```


***

今回書いてきたRubyのはなしはRailsを扱う上で最低限のものです。
Railsで自由自在にアプリケーションを作りたいと思っている人は自分の力でどんどんRubyの知識をつけていくことが必須でしょう。
入門編では動画でプログラミングを丁寧に解説しているサイトなどがオススメです。なれてきたら書籍を読み込んで概念を理解していきましょう！

##参考文献
- [x] 初めてのRuby (O'REILLY)
- [x] パーフェクトRuby
- [x] Ruby リファレンスマニュアル