パーフェクトRubyをひたすらやってみた。（アウトプット用）

##パーフィクトRubyとは
改訂2版 パーフェクトRuby Rubyサポーターズ (著)
という、Ruby界では有名な本。
全592ページ。

## パーフィクトRubyをやる理由
プログラミングスクール{[テックエキスパート](https://ganma-blog.com/techexpert-impressions/)}
でRubyの勉強していたが、業務レベルだと全くできないことがわかったので、1からRubyについて学ぶ。

(※環境構築はのぞく）
##初級編：1章から３章まで

### １章　Rubyの概要

読むコードを書くことがほとんどないので、Rubyについて学んだ。
環境構築ばかりなので、さらっと読んでこの章を終わり。

### 2章　Rubyの言語仕様
【主に学んだ内容】

 - メソッドの定義
 - 変数
    - グローバル変数
    - インスタンス変数
    - クラス変数
 - クラス
    - 継承
 - モジュール
 - 記法の括弧や細かいところ
 
では、一つずつコードをかいてアウトプットします。

#### メソッドの定義
みなさんもおなじみも**"def"**
インスタンスは基本的defを用いる。

簡単なコードを書くとこんな感じ↓

```ruby.rb
def orz(name)
  name.each do |name|
    puts "Ruby","#{name.upcase}"
  end
end
col=['意外にむずくね','って奥深くね','できたらいいな']

orz(col)
```
```bash:出力
Ruby
意外にむずくね
Ruby
って奥深くね
Ruby
できたらいいな
```
#### ここで理解できたこと

- defの仮引数の使い方
- メソッド名. do の使い方
- 変数への代入
- 配列

**とにかく右辺に出したい値をいれる**
自分で値をいれて試して、想像していた値がでたらOK的な感覚でやってます。


#### 変数
変数に関して現在学んだ内容は３つ

```ruby
1.グローバル変数　$code
どこでも使える変数
2.インスタンス変数　@code
インスタンス内で使用できる変数
3.クラス変数　@@code
クラス内で使える変数
```

**インスタンス変数の別の書き方**

```ruby
class Display
  attr_accessor :code
end
```
#### クラス
クラスのなかの継承について

```ruby
class parent
  def good
    puts "良い"
  end
end
class child < parent #サブクラス名<スーパークラス名
  def bad
    puts "悪い"
  end
end
child=Child.new
child.good #良い
child.bad #悪い
```

クラスの継承は<をいれるだけ。

クラス継承とインスタンス変数とクラス変数をクラス変数を使うと以下の通り。

```ruby
class Display_parent #スーパークラス
@@name_top="Ruby" #クラス変数
attr_accessor :name_back #インスタンス変数
def name_top
  puts @@name_top
 end
end
class Display_child < Display_parent #継承をしたもの
  def name_back
   self.name_back="まだパーフェクトじゃない"
  end
end
display_child=Display_child.new #display_childを作る
puts display_child.name_top,display_child.name_back #出力結果、Ruby　まだパーフェクトじゃない
```
簡単に書けばすぐにコードをかけるが、クラスやインスタンスを用いて書くと、意外とむずい。

####モジュール

```ruby
module Docomo
  class Parser
    puts "ドコモ"
  end
end
module Au
  class Parser
    puts "エーユー"
  end
end
Docomo::Parser
Au::Parser
```
ここはだだ覚えるだけ。

#### 記法の括弧や細かいところ

```ruby
%w(Ruby Java PHP JavaScript) #["Ruby", "Java","PHP", "JavaScript"] 配列
%i(Ruby Java PHP JavaScript)#[:Ruby,:Java,:PHP,:JavaScript] 配列
%r(/file/ruby) #\/file\/ruby/ スラッシュを使う場合に使う
name="ruby"
%q{It's #{name}} #"It's|#{name}" 式展開とバックスラッシュは無効
%(It's #{name}) #It's Ruby
%Q(It's #{name}) #It's Ruby
```

外部フィイル読み込み

```ruby
require '/path/to/ruby.rb' #/path/to/ruby.rbを読み取る
require './ruby' #rubyの実行されてるディレクトリにあるruby.rb
require 'ruby' #ruby.rbを探して読み取ってくれる
```

ここも覚えるだけ

### 3章　制御構造 組み込み関数

【主に学んだ内容】

 - 制御構造
    - 条件分岐
    - 繰り返し
 - 例外処理
 - 配列展開
 - yidld
 - 細かいところ
 
では、一つずつコードでアウトプット。


##制御構造
条件分岐のいろんな書き方

```ruby
#条件式１
n=1
if n.zero?
  puts 0
elsif n.even?
  puts "偶数でいた"
elsif n.odd?
 puts "奇数でした"
else
  puts "わかりません"
end
#条件式２
n=0
unless n.zero?
  puts "0ではありません"
else
  puts "0です"
end
#条件式３

```

caseの使った書き方

```ruby
name = 'ruby'

#条件式１型

name ="Java"
case name
when "ruby"
puts "勉強してる"
when "Java","PHP"
  puts "勉強してない"
else
  puts "よくわかりません"
end
name ="Java"
case name
when /ruby/
puts "勉強してる"
when /Java|PHP/
  puts "勉強してない"
else
  puts "よくわかりません"
end

#条件式２型

detected =
case name
when /ruby/
  puts "勉強してる"
  when /Java|PHP/
    puts "勉強してない"
  else
    "よくわかりません"
  end
  puts detected

#条件式３型

case name
when /ruby/ then "勉強してる"
when /Java|PHP/ then "勉強してない"
else "よくわかりません"
end

case name
when name == "ruby"
  puts "勉強してる"
when  name == "Java"||name == "PHP"
  puts "勉強してない"
else
  puts "よくわかりません"
end
```

繰り返し

 ```ruby
languages =%w{prel Python Ruby}
i=0
while i<languages.length
puts "hello","#{languages[i]}"
i+=1
end
```

#### 例外処理

 ```ruby
returned=
begin
value='値が帰ってくる'
raise #例外を投げる
rescue 
  value #valueが戻り値となる
  ensure
   puts '値が帰ってこない'
  end
  puts returned
```

この章は正直よくわからない
ここはあとで復習します。

#### 配列展開

```ruby
def name(a, *b)
  p [a, b]
end
#出力
> name(44, "ruby","Java","php")
[44, ["ruby", "Java", "php"]]
=> [44, ["ruby", "Java", "php"]]
```

#### yield

```ruby
def name
  puts "Do it"
  yield if block_given?
  puts "Just do it!"
end
name
name do
  puts "Move it!"
end
```
ブロックが与えられた時だけyieldが呼び出される

####細かいところ

**next breakの違い**

```ruby
# 配列の作成
languages= [ "Java", "Ruby","JavaScript" ,"Python","PHP"]

# 変数の初期化
count = 0

# 配列からそれぞれのインデックス要素を出力する
languages.each do |dev|
    # 変数に数値を加算
    count += 1
    # 条件を判定
    if count == 3
        # 判定結果が成立するのであれば実行
        next
    else
        # 判定結果が成立しないのであれば実行
        puts "#{count} : #{dev}"
    end
end
```

出力結果

```bash:ターミナル
1 : Java
2 : Ruby
4 : Python
5 : PHP
```
変数 count の値が 3 == 3 で成立した為に 3 行目だけが出力されない。

```ruby
# 配列の作成
languages= [ "Java", "Ruby","JavaScript" ,"Python","PHP"]

# 変数の初期化
count = 0

# 配列からそれぞれのインデックス要素を出力する
languages.each do |dev|
    # 変数に数値を加算
    count += 1
    # 条件を判定
    if count == 3
        # 判定結果が成立するのであれば実行
        break
    else
        # 判定結果が成立しないのであれば実行
        puts "#{count} : #{dev}"
    end
end
```
出力結果

```bash:ターミナル
1 : Java
2 : Ruby
```
変数 count の値が 3 == 3 で成立した為に 3 行目からは出力されず、処理が終了しています。

**ブロックをつわかないでファイルに書き込む方法**

同じディレクトリにtext_write_test.txtを置いておく。

```ruby
file =File.open("text_write_test.txt",'w')
file.puts "Hello world"
file.close
```

上記をすると"hello world"が代入する

vim で良いじゃないと思った。

以上、でアウトプットは終わり

### 理解できなかったところ

- 仮引数としてブロックを受けるところ
- オブジェトをブロックで渡す
- 例外処理
- ブロックローカル変数
- 外部コマンドを実行する

３章の最後のあたりが全く理解できなかったので、改めて復習したいと思います。

#### なぜ理解できなかったか

コードを書けば動くけど、実務や応用ができるかどうはわからないので、理解できたと聞かれると、「できてない」と答えるしかない。

### 今回パーフィクトRubyをやってみた感想

プログラミングは「考えること」が多い。

「プログラミングがわからない」ことを紐解いていくには、「どこの段階がわからないのか」を解読していくのが大事と感じました。

「どこまでできて」、「どこまでできない」のかそこを知っているのと知ってないことはかなり重要。

**無知を知る**

このことを肝にプログラミングを勉強していきたいと思います。