Rubyの復習1

<h1>本投稿の目的</h1>
Rubyの復習の自分用の議事録です。
以前,inputした知識のうち忘れたことを羅列して書いていきます。
そのため,自己満で書いただけなので脳に叩き込めたら消す予定です。

---
<h1>学習に使った教材</h1>
Udemyの ["はじめてのRuby on Rails入門-RubyとRailsを基礎から学びWebアプリケーションをネットに公開しよう"](https://www.udemy.com/course/the-ultimate-ruby-on-rails-bootcamp/) を教材として使用しました。

購入目的は以下の2つです。
①Cloud9上でRailsアプリを作ること
②デプロイすること

---
<h1>①配列とハッシュ</h1>

<h3>○配列</h3>

```ruby:qiita.rb
a = [変数1,変数2,変数3]
```
・添字は0から始まる
・変数2を取り出すには a[1]

○空判定

```ruby:qiita.rb
a.empty
```
⇨判定が空なら true

○検索文字判定

```ruby:qiita.rb
a.include?('検索文字')
```
⇨検索文字を配列に含む場合はtrueを返す

○連続値の配列への格納

```ruby:qiita.rb
aa = (0..100).to_a
```
⇨指定したn個以上の情報を配列に格納

○配列への操作

```ruby:qiita.rb
配列名.pop
配列名.shift
配列名 << 値
配列名.join (' ')
配列名.sort!.reverse!
```
上から順に
・一番最後の値を消去
・一番最初の値を消去
・一番最後に値を追加
・添字ごとに空白一個あけで結合
・配列の中身を反対にする


<h3>○ハッシュ</h3>

キーを指定することで,2変数の配列を作れる

```ruby:qiita.rb
ハッシュ = {'キー1' => 値1,'キー2' => 値2,'キー3' => 値3}
```
```ruby:qiita.rb
puts ハッシュ['キー1']
ハッシュ['キー4'] = 値4
ハッシュ['キー1'] = 値1
ハッシュ.delete('キー1')     
```
上から順に
・値の取り出し
・値の追加
・値の上書き
・値の削除

<h3>○シンボル</h3>

ソースコード 上では文字列
内部では整数として扱われる
⇨ハッシュ内部のアクセスが早くなる

```ruby:qiita.rb
ハッシュ = {キー1 : 値1,キー2 : 値2,キー3 : 値3}
```
```ruby:qiita.rb
puts ハッシュ[:キー1]　　　
ハッシュ[:キー4] = 値4　　
ハッシュ[:キー1] = 値1`     
ハッシュ.delete(:キー1)      
ハッシュ.has_key?(:探したいキーn)  
ハッシュ.size                                         
```

上から順に
・値の取り出し
・値の追加
・値の上書き
・値の削除
・探したいキーを持っているか?確認
・いくつキーを持つか?確認

<h1>②each配列とeachハッシュ</h1>
<h3>○each配列</h3>
```ruby:qiita.rb
numbers = [1,2,3,4,5]
numbers.each do |number|
```
**<別の記載方法>**

```ruby:qiita.rb
numbers = [1,2,3,4,5]
numbers.each { |number| puts number}
```
<h3>○eachハッシュ</h3>

```ruby:qiita.rb
scores = {luke: 100,jack: 90,robert: 70}
scores.each do |k,v|
     puts v
     puts "#{k},#{v}"
end
```
<h1>③クラス作成</h1>
```ruby:qiita.rb
class Car

  def initialize(name)
    puts 'initialize'
    @name = name
  end
  
  def hello
    puts "Hello! I am #{@name}."
  end
end

boxter = Car.new('boxter')
boxter.hello

carrera = Car.new('carrera')
carrera.hello
```

【出力結果】

```
initialize
Hello! I am boxter

initialize
Hello! I am carrera
```

【解説】
・class作成時の変数は1文字目は大文字
・インスタンス作成時に指定した引数をinitialzeの戻り値に指定できる
・インスタンス作成 とは,クラスを動かす際のcloneの作成のようなもの
　⇨宣言時は 変数 = クラス名.new()
・def initialize はインスタンス作成時に実行される処理
・インスタンス変数は,initialize内で定義した@変数
　⇨Class内でどこでも使用可能

<h1>④メソッドのオブジェクトの取得と書き換え</h1>

<h3>○取得時</h3>

```ruby:qiita.rb
class Car

  def initialize(name)
    @name = name
  end

  def name
    @name
  end
end

boxter = Car.new('boxter')
puts boxter.name
```

【出力結果】

```
boxter
```

【解説】
○def name
・class外から@nameへ読み取り可能にするためのメソッド
・これを'インスタンスメソッド'と呼ぶ(ゲッターメソッド)
・(インスタンス変数(@name)はクラス外からアクセスできない)

○puts boxter.name
・ インスタンス作成後の.nameメソッドを実行したことでアクセス可能
・.nameメソッドに対応する値@nameを取得可能

<h3>○書き換え時</h3>

```ruby:qiita.rb
class Car

  def initialize(name)
    @name = name
  end

  def name
    @name
  end

  def name = (value)
    @name = value
  end

boxter = Car.new('boxter')
boxter.name = '718boxter'
puts boxter.name
```

【出力結果】

```
718boxter
```

【解説】
○def nama = (value)
・インスタンス作成時は @name = 'boxter'
・.name = (value)メソッドによって@name = '718boxter' へ書き換えた

<h1>⑤アクセサメソッド (attr_accessorメソッド)</h1>

・下記3パターンの記述を全て1行で実現可能にするメソッド 
・他言語ではプロパティーと呼ばれる

<h3>○取得&書き換え時</h3>

**元々のコード**

```ruby:qiita.rb
def name
  @name
end

def name = (value)
  @name = value
end
```
**アクセサメソッド適用時**

```ruby:qiita.rb
attr_accessor :name 
```
<h3>○取得のみの時</h3>

**元々のコード**

```ruby:qiita.rb
def name
  @name
end
```
**アクセサメソッド適用時**

```ruby:qiita.rb
attr_reader :name 
```

<h3>○書き換えのみの時</h3>

**元々のコード**

```ruby:qiita.rb

def name = (value)
  @name = value
end
```
**アクセサメソッド適用時**

```ruby:qiita.rb
attr_writer :name 
```

<h1>⑥クラス変数</h1>
・Class内の別のメソッドごとに共通使用する変数

```ruby:qiita.rb
class Num
  @@num=0

  def num
    puts @@num
  end
  
  def decrement
    @@num += 1
  end
end

number = Num.new
number = num
number = decrement
number = num
number = decrement
number = num
number = decrement
```

【出力結果】
0
1
2

【解説】
・@@num は　numメソッド と decrementメソッド　で値を保持したまま使用可能
・(メソッドを行き来できる)
・開始文字は@@2文字から始める

<h1>⑦クラスメソッド</h1>
・インスタンスなしで直接呼び出せるメソッド

```ruby:qiita.rb
class Car

  def self.info
    puts "Test"
  end
 
end

Car.info
```
**【解説】**
・self.メソッド名 としてメソッドを記述する
・Car.info のようにモデル名.メソッドとして使用可能
・(インスタンスメソッドとの違いは,インスタンス名.info としないところ)

<h3>○複数のメソッドを一度にクラスメソッドにする場合</h3>

```ruby:qiita.rb
class Car

  class << self
    def info
      puts "Test1"
    end

    def inform
      puts "Test2"
    end

  end
end

Car.info
Car.inform
```

【解説】
・クラスメソッドにしたい各メソッドを class << self で囲む
・囲んだ中に,各メソッドを定義

---