Ruby社内勉強会 第1回

# 概要
単なる社内勉強会の記録ですが、Ruby初学者の参考になるかもしれないので内容を公開します。
今回は1回目です。

# 背景
- [JavaプログラマがRubyを使ってみた](https://qiita.com/dhirabayashi/items/3a22730708921b83d5de)の記事を社内で共有したところ、Rubyを勉強してみたいという話になったので開催することになった
- メンバー全員、Javaはわかる

# 進め方
- [Rubyがミニツク](http://www.minituku.net/courses/566428009/contents/200455862.html)をみんなで見ながら、講師（私）が内容の説明を行う
- 全員Javaはわかるので、Javaとあまり変わらない箇所などは適宜スキップする
- WindowsのPCを使用する
- 1回の開催で1時間ほど
- 動画、ドリル、演習はスキップする

# 注意事項
本記事のサンプルコードは全部を網羅していないため、適宜元サイトも参照してください。

# 学んだ内容
## ミニツクで学んだ範囲
「1. Hello, Ruby！」から「3. 便利なオブジェクト」の「配列」まで

## 詳細
### 環境構築
- [こちら](https://www.javadrive.jp/ruby/install/index1.html)を参考にインストールを実施
- 今回はRubyInstaller DEVKITなしをインストール

### Hello, Ruby!
- putsメソッドで標準出力へ文字列を出す
    - カッコは省略してもいい。むしろ、putsメソッドの場合は省略することのほうが多い

```ruby
puts "Hello, Ruby!"  # => Hello, Ruby!
```

- rubyコマンドでファイルを指定すると実行できる
    - rubyコマンドなしでも動作する？ -> おそらくインストール時に.rbファイルへの関連付けを行う設定にすれば直接実行できる
- REPLあり（irb）
    - irb上でputsを実行すると、「nil」と表示された
        - putsの戻り値がnilであるため
        - nilはJavaでいうnullと同等
- -e 指定の実行はワンライナーのため

### 端末に表示する
- printメソッドは改行を出力しない
    - printメソッドで改行するなら「\n」を使う
    - その場合、文字列は''ではなく""で囲う
- pメソッドで、人にわかりやすい表示になる
    - Stringの場合は""で囲われた値が出るなど
    - pメソッドはnilではない戻り値がある
- Stringリテラルを生成する際の違いとして、""は\nのようなバックスラッシュ記法を使える（特殊な文字として認識される）が、''の場合はそのままの文字列として表示される
- 変数は型がなく、何でも代入できる。宣言なしでいきなり代入式を書ける
    - 変数.class で、代入されている値が何の型か調べることが可能

### 四則演算
- 算術演算子は動作的にはJavaと同じ
    - Rubyの演算子は、実はメソッドであるという話もあるが、それは追い追い学んでいく

### 変数
- ""で囲う文字列の中に#{変数名}があると、変数の内容が出力される
 

### ifによる分岐
- 当然Rubyにもifがあり、動作としてはJavaと同様だが書き方が違う
    - 条件式にカッコはつけない
    - {}ではなくthen endで囲う（thenは省略してもいい）
    - 真偽の判定はJavaと全然違う
        - falseとnilが偽、それ以外は全部真
    - Javaでいうelse、else ifももちろんあるが、else ifは「elsif」と表記する
        - 
他の言語ではあまり見かけない表記

        - コメントにて指摘あり。Perlなど、elsifという記法を用いる言語は他にも存在する

```ruby
flag = true
if flag == true then
	p "true"   # => "true"
end
```

```ruby
flag = 0
if flag
	p "true"   # => "true"
end
```

### whileでの繰り返し
- 動作的にはJavaと同様だが書き方が違う
    - 条件式にカッコはつけない
    - {} ではなくdo endで囲う（doは省略してもいい）
    - 真偽の判定はif文と同じ
- 余談だが、Javaとは違ってインクリメント、デクリメントはない（Pythonと同様）
- for文はなくもないが、あまり使われない
    - Javaでいうなら拡張for文に相当する
- breakなどはあるが、そのうち学習する

### メソッド定義
- メソッド定義の書式はJavaとはかなり違う
    - defキーワードを使う
    - 引数がなければ()は書かない。引数があるとしても型は書かない
    - 戻り値の型は書かない
    - 最後に評価された値が戻り値として返る。return文もあるが省略してもいい
        - Rubyのメソッドには戻り値は必ずある（なさそうな場合でもnilが返っている）
- putsと同様、メソッド呼び出し時は()を省略可能。特に引数がない場合は大抵省略する
- メソッドの引数にはデフォルト値を設定可能

```ruby
def greeting
	puts 'Hello, Ruby!'
end

greeting   # => Hello, Ruby!
greeting   # => Hello, Ruby!

def example(args1, args2 = 3)
	args1 + args2
end

p example(1)   # => 4
```

### 日本語の取り扱い
- 常にUTF-8を使えばいいこととしてスキップ

### 文字コード指定による動作の違い
- 常にUTF-8を使えばいいこととしてスキップ

### 文字列
- 式展開（#{}）は変数に対してだけでなく算術演算などについても使える

### 正規表現
- //で囲うことで正規表現オブジェクトを生成できる
- 文字列とのマッチングには=~演算子を使う
    - マッチしたら位置を示す数値、マッチしなかったらnilが返る
    - falseとnilのみが偽というRubyの仕様があるため、=~の結果はそのままif文で使える

### 配列
- []で囲って、要素ごとにカンマ区切りで配列オブジェクトを生成する
- 配列の個別の要素を参照する書き方はJavaと同じで[]を付けて0から始まる添え字を指定する
- 要素数の取得もJavaと同じでlengthを使う
    - Rubyの場合は、[]もlengthも実はメソッドという話はあるが
- 配列の要素を一つずつ列挙してループするにはeachメソッドを使う
    - 繰り返したい処理は、ブロックという処理の塊を渡せる仕組みを使う
    - Rubyであまりfor文が使われない理由がこれ

```ruby
["foo", "bar", "baz"].each do |n|
  puts n
end
# => foo
# => bar
# => baz
```

- 数値を1ずつ増やしてループするような、Javaのfor文に相当する書き方をしたければどうするか？そういう配列を用意しなければならないか？
 - 下記のような書き方で可能
     - (0..5)のような記法でRangeオブジェクトを生成することができ、それに対してeachメソッドを呼ぶ
     - 5.timesのような記法で、それに対してブロックを渡す（この場合は0から4になるが）

```ruby
(0..5).each do |i|
	puts i
end
# => 0
# => 1
# => 2
# => 3
# => 4
# => 5
```

```ruby
5.times do |i|
	puts i
end
# => 0
# => 1
# => 2
# => 3
# => 4
```

```ruby
5.times do
	puts 'aaa'
end
# => aaa
# => aaa
# => aaa
# => aaa
# => aaa
```

# 次回
https://qiita.com/dhirabayashi/items/2db0fb3fb12b6d4e48b8