Rubyを少しでも書けるために最低限知っておく必要な知識 前編

## 目次
* Rubyとは
* 特徴
* オブジェクト
* 変数
* 定数
* 配列(Array)
* ハッシュ(Hash)
* コメント
* 制御構造


## Rubyとは
まつもとゆきひろ氏によって開発されたオブジェクト指向スクリプト言語
## 特徴
* オブジェクト指向
[オブジェクト指向の詳細](https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91)

* マルチプラットフォーム
Rubyで書いたプログラムは実行環境がインストールされている
 Windows、Linux、Mac OS など様々な環境で動作させることができる。

* オープンソースである
	Ruby 実行環境は無料で入手することができる。


## オブジェクト
データを表現する基本的な単位をオブジェクトと言う。
主なもの

* 数値オブジェクト
1 100 1000 など数を表すオブジェクト

* 文字列オブジェクト
'Hello world' 'こんにちは' など文字列並びからなるオブジェクト

* 配列オブジェクト ハッシュオブジェクト
複数のデータをまとめるためのオブジェクト


## 変数
オブジェクトにつける名札

```ruby:variable.rb
name = 'bob'
```
name -> 名札
'bob' -> 文字列オブジェクト
### 変数の種類
* ローカル変数
先頭がアルファベットが小文字、または「 _ 」で始まるもの

* グローバル変数
先頭に「$」で始まるもの

* インスタンス変数
先頭に「@」で始まるもの

* クラス変数
先頭に「@@」で始まるもの
* 疑似変数
	「true」「false」「nil」「self」など特殊な変数

### ローカル変数とグローバル変数
	
```ruby:./scope.rb
$x = 0 # グローバル変数
x = 0 # ローカル変数

require sub

puts "グローバル変数 $x #{$x}"
puts "ローカル変数 x #{x}"
```

```ruby:./sub.rb
$x = 1
x = 1
```

```shell:実行結果
$ruby ./scope.rb
グローバル変数 $x 1
ローカル変数 x 0
```
結果を見てみると,グローバル変数$xには1が代入されておりローカル変数xには0が代入されている。

ローカル変数とは **局所的**であるため、あるところで使われている場所の変数名と違う場所で使われている変数名が同じでも無関係な変数と扱われる。
グローバル変数とは **大域的**であるため、プログラム中のどこでも使われても、同じ名前であれば同じ変数として扱われる。


> #### スコープ
> 変数は宣言する場所によって有効範囲が異なる。
> 有効範囲のことを変数のスコープ(scope:範囲)である。
	
## 定数
変数と同様にあるオブジェクトにつける名札の働きをするが、変数と違って一度代入したあとに変更をすると警告される。
先頭にアルファベットの大文字で始まるものが定数となる。

```ruby:constant.rb
RUBY_VERSION = 2.2.0 # 定数
```	

## 配列(Array)
配列はいくつかのオブジェクトを順に並べて格納していくオブジェクトの集合体として、基本的によく使われる。
### 配列の作り方
配列を作るには、要素を,で区切り[]で囲むことで作られる。
中身が空な配列を作るためには要素を書かず、[]で囲むことで作れる。
また%wを使うことで,の区切りがなしで要素が書ける。

```ruby:array.rb
nums = [1,2,3,4,5,6] # 配列の中身は 1 2 3 4 5 6 
arayy_emp = [] # 配列の中身は空
nums_w = %w(1 2 3 4 5 6) # 配列の中身は "1" "2" "3" "4" "5" "6" 
# %wは要素すべてが文字列オブジェクトになる
```

### 配列の要素を参照
配列は要素を順び並べて格納されている。
要素を参照するには、要素の場所を指定することで参照することができる。
配列名[要素の場所]
 
最初の要素は0を指定してあげることで参照できる。

```ruby:array_reference.rb
names = ["田中","小林"]
puts names[0] # 田中 
```

### 配列にオブジェクトを格納する
すでに作られている配列にオブジェクトを格納することができる。
配列名[格納する場所] = 格納するオブジェクト

```ruby:array_store.rb
names = []
names[0] = '田中'
```

## ハッシュ(Hash)
文字列やシンボルなどをキーにしてオブジェクトを格納する。

### シンボル(Symbol)
文字列に似たオブジェクトでRubyがメソッドなどの名前の識別に使うラベルをオブジェクトにしたもの。
シンボルは先頭に「:」を付ける。

```ruby:symbol.rb
sym = :foo
```

ハッシュの構成は
{Key => value}となる。
key オブジェクトを取り出すためのもの
value キーと紐付けされているオブジェクト 
### ハッシュの作り方
新しいハッシュを作る場合{key => value}または{ket: value}で作ることができる。
また空のハッシュを作る場合は{}で囲むことで作ることができる。

```ruby:hash.rb
person = { :name => 'Bob', :age => 22 }
#または
person_oth = { name: 'Bob', age: 22 }
```


### ハッシュの操作
ハッシュからオブジェクトを取り出すことや、オブジェクトの格納は配列の時と同じです。

```ruby:hash_ope.rb
person = {}
person[:name] = 'Bob'
person[:age] = 22
puts person[:name]
puts person[:age]
```

## コメント
コメント文の先頭「#」を付けることでコメントとなる。
複数行の場合は コメント文の先頭に「=bigin」後尾に「=end」を付ける。これをブロックコメントと言う。

```ruby:./comment.rb
# コメント

=begin
複数行コメント
複数行コメント
複数行コメント
=end
```

※ コーディング規約である「[The Ruby Style Guide](https://github.com/fortissimo1997/ruby-style-guide/blob/japanese/README.ja.md#%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88)」にはブロックコメントを使わないことが推奨されています。

## 制御構造
* 随時処理
	プログラムを書かれた通りに、先頭から順に実行する。

* 条件分岐
	ある条件が成り立つ場合と成り立たない処理を実行する。

* 繰り返し
	ある条件が成り立つ間、処理を繰り返す。


### 条件分岐
条件分岐をするための処理として、「if文」「unless文」などが準備されている。
#### if文
if文は最も基本的な条件判断文である。
if 条件 ~ end の中に処理を書く

```ruby:if.rb
pet = 'Dog'
if pet == 'Dog' # if 条件
	puts 'petはDog' # 条件が正の場合に実行する文
end
```
 ※ コーディング規約である「[The Ruby Style Guide](https://github.com/fortissimo1997/ruby-style-guide/blob/japanese/README.ja.md#%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88)」ifの実行する文が一行の場合は1行に纏める書き方が推奨されている
 
```ruby:if.rb
pet = 'Dog'
puts 'petはDog'if pet == 'Dog' # 実行する文 if 条件
```

 条件が偽の場合、実行する文を書く場合は下記の通りに書く
 
```ruby:if_else.rb
pet = 'Cat'
if pet == 'Dog' # if 条件
	puts 'petはDog' # 条件が正の場合に実行する文
else
	puts 'petはDogではない' # 条件が偽の場合に実行する文
end
```
条件が偽の場合、if文を実行される場合は下記の通りに書く

```ruby:if_elsif.rb
pet = 'Cat'
if pet == 'Dog' # if 条件
	puts 'petはDog' # 条件が正の場合に実行する文
elsif pet == 'Cat'
	puts 'petはCat' # 条件が偽の場合に実行する文
else
	puts 'petはDogではなく、かつCatでもない'
end
```

#### unless文
ifとは反対の役割をする条件判断文である。
ifの場合は条件が正の場合の処理を実行していたが、unlessの場合は条件が偽の時に実行する。
unless 条件 ~ endの中に処理を書く

```ruby:unless.rb
num = 100
unless num == 100 # unless 条件
	puts 'numは100ではない' # 条件が偽の場合に実行する文
end
```

※ コーディング規約である「[The Ruby Style Guide](https://github.com/fortissimo1997/ruby-style-guide/blob/japanese/README.ja.md#%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88)」unlessの実行する文が一行の場合は1行に纏める書き方が推奨されている

```ruby:unless.rb
num = 100
puts 'numは100ではない' unless num == 100 # 条件が偽の場合に実行する文 unless 条件 
end
```

### 繰り返し
同じ処理をするための処理として、「for文」「while文」until文」「timesメソッド」「eachメソッド」「loopメソッド」などが準備されている。
今回は「timesメソッド」「eachメソッド」「loopメソッド」について説明する。
#### timesメソッド
一定回数同じ処理をさせる場合に使用される。
オブジェクト.times do ~ end の中に処理を書く

```ruby:times.rb
10.times do  #オブジェクト.times do
	puts 'test'  #実行する文
end
```

また実行回数をしる為には
オブジェクト.times do |変数| ~ endと書く

```ruby:times.rb
10.times do |i|  #オブジェクト.times do |変数|
	puts "#{i} test"  #実行する文
end
```

#### eachメソッド
オブジェクトの集りに対して1つずつ取り出して処理をしていく時に使用される。
オブジェクト.each do |変数| ~ endの中処理を書く

```ruby:each.rb
nums = [1,2,3,4,5]
nums.each do |num|
	puts num
end
```

今回は説明していないが、for文と同じ動きをしている

```ruby:for.rb
nums = [1, 2, 3, 4, 5]
for num in nums
	puts num
end
```

#### loopメソッド
終了条件がない繰り返しをする時に使用される。
「timesメソッド」と「eachメソッド」はオブジェクトが終ると終了という条件で動いているが、loopは終了条件がない。
loop do ~ end の中に処理を書く

```ruby:loop.rb
loop do
	puts 'loop ‹‹\(´ω` )/››‹‹\( 　´)/››‹‹\( ´ω`)/››'
end	
```
繰り返しを終了させるにはbreakという繰り返しを終らせる命令文が必要である

例 変数countが10以上になると終了する

```ruby:count_break.rb
count = 0
loop do
	if count >= 10
		break
	end
        puts count
	count += 1
end
```

## 後編
[Rubyを少しでも書けるために最低限知っておく必要な知識 後編](http://qiita.com/kodaitakahashi/items/052b5ad7fb5e74b35bf0)

## 参考文献
[楽しいRuby 第4版](https://tanoshiiruby.github.io/4/)