第１回　Ruby勉強会

```
社内で開催した勉強会で使用したものです。
間違い等あればご教授いただけると助かります。
```

# **Rubyとは...**

## **概要**
　オブジェクト指向スクリプト言語。
　1993年に生まれ、1995年にfj上に登場。
　Rubyを使用したフレームワーク「Ruby on Rails」が2005年頃に登場して
　徐々に注目され始める。
　昨今の[シェア増減](http://www.tiobe.com/index.php/content/paperinfo/tpci/Ruby.html)
　
**影響を受けた言語**　Smalltalk, LISP, Perl, Python, CLU
**影響を与えた言語**　D言語、Groovy
**魅力**
　・JavaやC言語などとの連携が可能。
　・Gemを使うことで安全かつ高速に実装できる。
　・Rubyの代表的なフレームワークであるRailsの安定性
　　⇒言語ではなくフレームワークでのみで見たとき、人気が高く、使用者が多いので安定している。
　・日本語向けのドキュメントがしっかりしており、日本人開発者も多いので開発しやすい。
　・比較的きれいで、少ないコードでの実装が可能
　・言語のバージョン管理が楽
　・インタプリタ言語であるため、コンパイラの実行は不要。
　・移植性が高く、様々な環境で動作する。
**欠点** 
　・開発コストが高い
　　⇒開発環境の構築から難しく感じる。
　　　いろいろなことが出来るという反面、始めのうちは使い分けや覚えることの多さで頭を悩ませる。
　　　（私も初心者なので、上記の状態は今現在の私の事です。）
　　　開発初心者にもお勧めはできないかも・・・？
　・Gemは便利だが、提供元が一切更新をしなくなった場合の事を考えると・・・
　　⇒不安でしかないです。大人気のGemであれば、後任者などが出るかなと思いますが・・・
　　　Gem選定はしっかりしないと、後で自分で直すか別のGemを入れるか新しく実装し直しか
　　　後悔する羽目になりそうです。
　・環境に左右される
　　⇒「このGemはWindowsで使えない」というのがありました。
　　　Gemというよりは依存パッケージがWindowsで使用できないものだったのですが・・・
　　　現在もホストPCにはWindowsを使用しているのでVMや社内サーバーのLinux系の環境を使って
　　　モノを作っています。

[PHPとRubyを徹底比較！開発効率をあげて収益を増やす](http://techracho.bpsinc.jp/piichan1031/2013_05_13/8578)

# **基本構文**
## **コメント**
Rubyのコメントは以下の方法になります。

```
# 一行コメント
# puts "debug code"

# 複数コメント
=begin
puts "debug code"
=end

```

## **区切り**
**区切り**　改行とセミコロンが区切りの扱いになります。
*基本、関数を連ねて書くことは稀なので、末端にセミコロンなどを書く必要はないと
覚えておくといいかと思います。*

```
# ○
print "aa"; print "bb"
print "cc"

# ×
print "aa" print "bb"
```

**行をまたいで式を続ける**　バックスラッシュ(or 円マーク)

```
puts \
  "Hello " +
  "World!"
```

## **出力**
*print,puts,printf*

```
# 「abc」と出力される
print "abc"

# 「abc」と出力された後、改行される
puts "abc"

# 「cab」と出力される
printf("%sab", "c")
```


## **変数**

* Rubyには宣言は必要ありません。
* 変数には、半角のアルファベットと数字、アンダースコア(_)が使用できます。
* 変数の一文字目は小文字のアルファベットを使用する必要があります。
* 変数には「ローカル変数」「インスタンス変数」「クラス変数」「グローバル変数」「定数」があります。
　（ここで使っているのは「ローカル変数」です。）

```
# 「lang is Ruby」
lang = "Ruby"
puts "lang is #{lang}"
```

・
## **配列/ハッシュ**

* **配列**

```
# 上から下へarrayの値は影響しています。
# 定義
array = ['a', 'b', 'c']

# 参照
puts array[0] # 「a」
puts array[-1] # 「c」※ 後ろから１番目の値を参照
puts array[0,2] # 「ab」※ 添え字が0の値から2つ参照
puts array[0..2] # 「abc」※ 添え字の0から2まで参照

# 「a b c 」
array.each do |value|
  print "#{value} " # ※ arrayの添え字ごとに値が出力される
end

# 「[0, 'a'][1, 'b'][2, 'c']」
array.each_with_index do | value, index |
  print "[#{index}, " # ※ arrayの添え字ごとに添え字が出力される
  print "#{value}]"  # ※ arrayの添え字ごとに値が出力される
end

# 代入
array[3] = "d" # ['a', 'b', 'c', 'd'] ※ 添え字が存在しなければ追加
array[0] = 1 # [1, 'b', 'c', 'd'] ※ 添え字が0の値に対して代入
array[1,2] = 2, '3' # [1, 2, '3', 'd'] ※ 添え字が1の値から２つ分代入
array[-1] = '4' # [1, 2, '3', '4'] ※ 後ろから１番目の値に代入
array[0..3] = '1', '2', '3' # ['1', '2', '3']
                            # ※ 添え字として0から3まで用意し、値を与える。arrayに値を入れなおすことと同義。
```

* **ハッシュ**

```
# 上から下へarrayの値は影響しています。
# 定義
hash = {'a' => 0, 'b' => 1, 'c' => 2}

# 定義(変数からハッシュへ変換)
array = ['a', 0, 'b', 1, 'c', 2]
hash = Hash[*array] #  {'a' => 0, 'b' => 1, 'c' => 2}

# 参照
puts hash['a'] # 0

# 「a b c 」
hash.each do |value|
  print "#{value} " # ※ arrayの添え字ごとに値が出力される
end

# 「[0, 'a'][1, 'b'][2, 'c']」
hash.each do | value, key |
  print "[#{key}, " # ※ hashのキーが出力される
  print "#{value}]"  # ※ hashのキーごとの値が出力される
end

# 代入
hash["d"] = "3"; # ['a', 'b', 'c', 'd'] ※ キーが存在しなければ追加
hash["d"] = 3; # ※ キーが"d"の値に対して代入
```

## **四則演算**

```
# 基本
puts(1 + 2) # 3
puts(3 - 1) # 2
puts(2 * 6) # 12
puts(12 / 4) # 3
puts(3 ** 3) # 18

# 減算
puts(2 - 5) # -3

# 除算
puts(10 / 4) # 2
puts(10.0 / 4) # 2.5
puts(10 % 4) # 2

# 符号を使用した計算
puts(5 + (10 / 2)) # 10


```

## **式展開**

```
# 3 + 1 は 『4』です。
a = 3; b = 1
puts ("#{a} + #{b} は 『#{a + b}』です。")
```

## **制御**
・比較演算子

| 書き方 | 説明 |
|:-------:|:-------|
| a === b | 等しい |
| a !=  b | 等しくない |
| a  >  b | aよりも大きい |
| a  <  b | aよりも小さい |
| a >=  b | b以下である |
| a <=  b | b以上である |

・条件分岐（if, switch）
　JavascriptやPHPと違って括弧を使わない。
　ifは条件式に当てはまればtrueだが、条件式に当てはまらなければtrueというunless文もある。

```
# ①if文
a = 10
b = 5
# aが大きい
if a > b 
  puts 'aが大きい'
elsif a === b
  puts 'aとbは同じ'
else
  puts 'aが小さい'
end  

# ②if文(範囲)
if (5..10) === a
  puts 'aは5から10の間です。'
end

# ③case文
c = 2
case c
  when 1 then
    puts('cが1の時の処理')
  when 2, 4 then
    puts('cが2か4の時の処理')
  when 3 then
    puts('cが3の時の処理')
  else
    puts('例外処理')
end

# ⑤case文(①をcase文で書いた場合)
case
  when a > b then puts 'aが大きい'
  when a < b then puts 'aが小さい'
  else puts 'aが大きい'
end

```
　
・ループ文（while, for, each）
　Rubyのfor内部ではeachが使われているそうです。そのため、forを使用するシチュエーションでは
　eachで統一した方が良さそうですね。（情報元：[初めてのRuby/(著)Yugui](http://www.amazon.co.jp/初めてのRuby-Yugui/dp/4873113679)）

```
array = ['apple', 'pineapple', 'orange', 'banana']

# hogeに'orange'が入るまでループ処理
hoge = nil; i = 0
while hoge != 'orange' do
  puts "check #{ array[i]}"
  hoge = array[i]
  i += 1
end

# hogeに'orange'が入るまでループ処理(forの場合)
for fruit in array do
  puts "check #{fruit}"
  if fruit === 'orange'
    break
  end
end

# hogeに'orange'が入るまでループ処理(eachの場合)
array.each do | fruit |
  puts "check #{fruit}"
  if fruit === 'orange'
    break
  end
end

# 3回ループさせたいという場合
[1,2,3].each do | idx |
  puts idx
end

```

・基本的な関数
　関数の後に「!(エクスクラメーションマーク)」を付けると破壊的メソッドと言われるものになります。

```
a = "hoge";
b = "HUGA"

# 英数字の小文字を大文字に変換する
puts a.upcase # HOGE
puts a # hoge(上の行で変換後に代入していないから影響を受けていない)

puts b.downcase! # huga
puts b # huga (上の行で「!」が使われているので、変換元が影響を受けている)
```

# **推奨開発ツール**

* Sublime Text3
軽量で、多言語に対応。パッケージも豊富。幅広いカスタマイズもできる。しかもフリー。
パッケージを入れすぎると重くなるので注意した方が良いですが・・・。

* RubyMine
Rubyに特化していることもあり、コードスニペット・コードの実行が簡単にできる、幅広いカスタマイズもできて軽量。
ただ有償。30日間の試用期間を過ぎると高いけど欲しくなります。（私は）

# **参考サイト**

* [オブジェクト指向スクリプト言語　Ruby](https://www.ruby-lang.org/ja/)
* [Ruby - Wikipedia](https://ja.wikipedia.org/wiki/Ruby)
* [文字列にするか、シンボルにするか、いったい何が違うのだ？](http://d.hatena.ne.jp/zariganitosh/20061118/1163851550#20061118f1)
* [[Ruby Memo] オブジェクトのクラスと型を調べる](http://jlinuxer.dip.jp/?p=770)

# **参考書籍**

* [初めてのRuby/Yugui (オライリー・ジャパン)](http://www.amazon.co.jp/初めてのRuby-Yugui/dp/4873113679)