Rubyについて2

<h1>Rubyとは</h1>
日本人が作ったプログラミング言語で初心者の方にも分かりやすい言語になっています！
できる事は主にWebアプリ制作になります！
Webアプリとはアマゾンや、食べログなどインターネット上で使うシステムの事です！

<h1>環境構築</h1>
プログラミングを行うには、まずコードを打つ環境を整える必要があります。
システムを作るには、VS.codeというエディタをダウンロードして、Rubyをインストールするなどして環境を整える必要があります！
ですが、今回は練習ですので、その必要はありません！
paiza.ioという練習用の環境を使ってやっていきたいと思います！
⇓
https://paiza.io/projects/r8lj6ejAxv0ZdkRru2XrzQ

まずこちらのURLを開いてください！

![スクリーンショット 2021-08-21 165438 paizo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400613/3436e891-0da5-36a5-e1fa-2a56cb47a3e5.png)
すると、上記のようなエディターがでます。左斜め上の赤線が引いてある場所が言語の選択になっておりますのでクリックします。

⇓

![スクリーンショット 2021-08-21 165910 　選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400613/205e004c-c19f-2055-2135-23f5e5108b3d.png)
言語の選択肢がでますので、Rubyをクリックします。

⇓

![スクリーンショット 2021-08-21 170242 ruby.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400613/6e26f61c-b0bb-a54b-ff80-e7fc49b227a9.png)

左斜め上の言語がRubyになりましたら、環境構築完了です！

では、実際に手を動かしてコードを書いていきましょう！！('_')
手を動かすことによって理解度が全然違います！

これができれば、問題が終わる頃にはRubyが書けるようになっていますので、頑張りましょう！

こちらの続きを今回は行います！
⇓
https://qiita.com/Tech_Leaders/private/f0250260fa6d5661781a

まだやっていない方は、上記のURLで学習をお願いします！

<h2>メソッド（関数）を出力してみよう</h2>
<font color="red">メソッド(関数)</font>とは、プログラムの別の場所から呼び出せる処理のまとまりの事です。
メソッドは呼び出されるまで、実行されません。

それでは実際にコードを書いていきましょう！

```ruby:paiza.io
#engineerがメソッド名
#userが引数
  def engineer(user)
    puts "#{user}月収60万円" #defからendまでメソッド
  end

engineer("貴田さん") #引数="貴田さん"
engineer("勉さん") #引数="勉さん"
```
⇓

```ruby:出力結果
貴田さん月収60万円
勉さん月収60万円
```

defは、メソッドを作る時に行われて、engineerはメソッド名になります。

カッコの中(user)は<font color="red">**引数**</font>と言います。
引数はメソッドを呼び出すときにメソッドの外から代入する事ができる変数です。

ここだとengineer("貴田さん")がdefとendの外にあり、engineerの()内の"貴田さん"がuserの引数に当たる所に代入されて、engineer(user)メソッドが呼び出されるという流れです！

engineer(user)というメソッドが呼び出されて、def engineer(user)とendに挟まれている部分の処理が実行されます！

呼び出さないと処理は実行されません。

出力結果が
"貴田さん月収60万円"
"勉さん月収60万円"
という事になります。

![スクリーンショット 2021-09-03 235121.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400613/8117da0f-4a98-37cb-761a-4517a706a0a9.png)



数字を引数に代入した場合

```ruby:paiza.io
#engineerがメソッド名
#moneyが引数
  def engineer(money)
    puts "めざせ月収#{money}万円" #defからendまでメソッド
  end

engineer(60)

```
⇓

```ruby:出力結果
めざせ月収60万円
```

数字の場合は""（ダブルクォテーション）←がいらなくなります。

それにしても、月収60万円羨ましいですね！！(*'ω'*)
では実際に説明しても分かりずらいと思いますので実際に手を動かしていきましょう！

<h2>演習問題１</h2>

１－１.shoppingメソッドに引数bagにシャネルとグッチとビトンを代入して「０００を買いました」と出力してみましょう。

１－２.shoppingメソッドに引数bagにシャネルとグッチとビトンを代入して「ビトンは買いました」「シャネルは買ってません」「グッチはもらいました」と出力してみましょう。


<h2>メソッドの引数について</h2>
次にメソッドの引数について補足を致します。
メソッドに引数がない場合は、引数なしという形になり、空の()は必要ありません。
他のプログラミング言語では、()を付ける場合が多いですが、rubyの場合は必要ないです。

```ruby:paiza.io
#foodがメソッド名
  def food
    puts "シラス丼が食べたい"
  end

food

```

```ruby:出力
シラス丼が食べたい
```


複数の引数を受け取る場合はカンマで区切って、複数持たせる事ができます。
呼び出すときもカンマで区切ぎります。

```ruby:paiza.io
#dreamがメソッド名
  def dream(how, want)
    puts "#{how}彼女が#{want}"
  end

dream("可愛い", "欲しい")

```

```ruby:出力
"可愛い彼女が欲しい"
```

引数のデフォルト値というのもあります。
⇓

```ruby:paiza.io
#dreamがメソッド名
  def dream(how="美人な", want="欲しい")
    puts "#{how}彼女が#{want}"
  end

dream
dream(nil, "凄く欲しい")
dream("可愛い", "欲しい")

```

```ruby:出力
美人な彼女が欲しい
彼女が凄く欲しい
可愛い彼女が欲しい
```

howにはデフォルト値である"美人な"が入っており、wantには"欲しい"入っています。

その結果引数なしの場合は"美人な彼女が欲しい"
dream(nil, "凄く欲しい")の場合は"彼女が凄く欲しい"
（nilは何もないという意味です）
dream("可愛い", "欲しい")は"可愛い"と"欲しい"が代入されていますので、"可愛い彼女が欲しい"となります。


<h2>演習問題２</h2>

２－１.メソッド(dream)に引数がない状態で、"月収50万円稼ぐ"と出力してください。

２－２.メソッド(dream)にpgという引数とmoneyという引数を二つ持たせて、"プログラマーになって月収50万円稼ぐ"と出力してください。

２－３.２－２をデフォルト値で出力してください。

２－４.デフォルト値で出力しましたら、もう一つ、"フルスタックになって月収100万円稼ぐ"と出力してください。

<h2>キーワード引数</h2>
<font color="red">**キーワード引数**</font>とは引数に名前をつける機能の事を言います。
では実際に書いた方が早いので書いていきたいと思います！

```ruby:paiza.io

  def nishino_age(age: 29)
    puts age
  end

nishino_age
nishino_age(age: 30)
```

```ruby:出力
29
30
```

<font color="red">**引数: 値　で:(コロン)**</font>
を引数の後につけて値を代入する事をキーワード引数と言います。
上記で言うと
def nishino_age(age: 29)の、age:の部分です！

メリッドは引数の意味が見た目で分かりやすくなります！
この場合ですと、ageをキーワード引数として渡しているので年齢を渡しているんだな！
と分かりやすくなっています！

<h2>演習問題3</h2>
３－１.my_ageというメソッドのキーワード引数(age)に自分の年齢を入れてみましょう。

<h2>可変長引数</h2>
1つの引数で、複数の値を配列で受け取る事ができる引数を<font color="red">**可変長引数**</font>と言います！

実際に書いていきたいと思います。

```ruby:paiza.io

  def place(*i)
    puts i
  end

place(1,2,3)
place("千葉","神奈川","東京")
```

```ruby:出力
1
2
3
千葉 
神奈川
東京
```

引数の前に*を付ける事によって可変長引数になります。
数字も文字も配列で出力されます。
このように可変長引数は一つの引数で複数の値を受け取る事ができます！


<h2>演習問題4</h2>
４－１.可変長引数を使ってdinnerメソッドのfood引数にmeetとvegetableとfishを入れましょう。

４－２.可変長引数を使ってdinnerメソッドのprice引数に500と1000と2000を配列で入れましょう。


<h2>オプション引数</h2>
１つの引数で復習の値をハッシュで受け取る引数を<font color="red">**オプション引数**</font>と言います
hash値はキーとバリューの組み合わせでデータを表現できる事を言います！
<font color="red">**{:キー=>バリュー}**</font>
こんな形でデータを受け取れます。
では実際に動かしていきたいと思います。

```ruby:paiza.io

  def country(**japan)
    puts japan
  end

country(place1: "千葉", place2: "神奈川", place3: "東京")
```

```ruby:出力
{:place1=>"千葉", :place2=>"神奈川", :place3=>"東京"}
```

引数の前に<font color="red">**</font>を付ける事によってオプション引数になります。
ハッシュ値で受け取る事ができます！

ちなみにハッシュのキーとバリューも引数の後ろにkeysとvaluesを打つことで出力する事ができます。

```ruby:paiza.io

  def country(**japan)
    puts japan.keys
    puts japan.values
  end

country(place1: "千葉", place2: "神奈川", place3: "東京")

```

```ruby:出力
place1 
place2
place3
千葉
神奈川 
東京
```

<h2>演習問題5</h2>
５－１.オプション引数を使ってfoodのメソッドの引数fishの中にtunaが800円とoctopusが300円とsalmonが500円をハッシュ値で入れましょう。

<h2>クラスの定義</h2>
まずはイメージをしてみましょう！
プログラムでエンジニアの情報を書きたい場合

エンジニア
名前：　貴田
年齢：　32歳
月収：　60万円

名前：　勉
年齢：　33歳
月収：　80万円

エンジニアの方々にはそれぞれ「名前」と「年齢」と「月収」という情報があります。
このエンジニアの方々を「もの」として捉えると
「もの」は「名前」や「年齢」や「月収」の情報を持っているということになり
この「もの」がプログラミングの場合<font color="red">**「オブジェクト」**</font>と言います

プログラミングで前述したエンジニアのデータのようなものを作る場合、
先に設計図を用意する必要があります。
そしてこの設計図のことを<font color="red">**クラス**</font>と呼び、「もの」のことを<font color="red">**インスタンス**</font>と呼びます。

クラスは<font color="red">**class [クラス名]**</font>で定義することができます。
クラス名は必ず大文字で始めることとclassに対してendを記述する必要があります。

```ruby:paiza.io
class Engineer
end
```

これで「エンジニアという設計図」ができました。

このメニューという設計図に、「名前」と「年齢」と「月収」という情報が持てるよう記述してみましょう。

情報を持たせるためには、attr_accessorを使います。

name属性とage属性とmoney属性を追加しましょう！

```ruby:paiza.io
class Engineer
  attr_accessor :name
  attr_accessor :age
  attr_accessor :money
end
```

これでエンジニアというクラス(設計図)に名前と年齢と月収いう属性を持ったものが用意できました。


次に、用意したEngineerクラスから実際のエンジニアの方のデータになるインスタンスを生成してみましょう。

クラスをもとに、新たにインスタンスを生成する場合は クラス名.newと記述します。



さらに、 <font color="red">**変数名 = クラス名.new**</font>と記述することで生成したインスタンスを変数に代入することも可能です。


```ruby:paiza.io
class Engineer
  attr_accessor :name
  attr_accessor :age
  attr_accessor :money
end

engineer_1 = Engineer.new
```

これで空の状態のインスタンスが出来上がりました！
そして、生成したインスタンスをengineer_1という変数に代入している為、
この変数をインスタンスとして利用できるようになります。

ですが、この状態ではまだこのインスタンスは名前や価格の情報の値を持っていません。

次にこのインスタンスに情報を加えてみましょう！
それでは生成した空のインスタンスに、各情報を追加してみましょう。
インスタンスに情報を持たせる場合、クラスから用意したインスタンスに値を代入します。

具体的には、<font color="red">**インスタンス.属性名 = 値**</font>と記述します。
.（ドット）で繋げるので、ドット記法と言います。

```ruby:paiza.io
class Engineer
  attr_accessor :name
  attr_accessor :age
  attr_accessor :money
end

engineer_1 = Engineer.new

# インスタンスに名前の情報を追加します。
engineer_1.name = "貴田"

# インスタンスに価格の情報を追加します。
engineer_1.age = "#{32}歳"

# インスタンスに月収の情報を追加します。
engineer_1.money = "月収#{60}万円"

puts engineer_1.name
puts engineer_1.age
puts engineer_1.money
```

```ruby:出力結果
"貴田"
"32歳"
"月収60万円"
```

次に貴田さんと勉さんの二人のデータのインスタンスを作成してみましょう！

```ruby:paiza.io
class Engineer
  attr_accessor :name
  attr_accessor :age
  attr_accessor :money
end

engineer_1 = Engineer.new

# インスタンスに名前の情報を追加します。
engineer_1.name = "貴田"

# インスタンスに価格の情報を追加します。
engineer_1.age = "#{32}歳"

# インスタンスに月収の情報を追加します。
engineer_1.money = "月収#{60}万円"


engineer_2 = Engineer.new

# インスタンスに名前の情報を追加します。
engineer_2.name = "勉"

# インスタンスに価格の情報を追加します。
engineer_2.age = "#{33}歳"

# インスタンスに月収の情報を追加します。
engineer_2.money = "月収#{80}万円"


puts engineer_1.name
puts engineer_1.age
puts engineer_1.money

puts engineer_2.name
puts engineer_2.age
puts engineer_2.money 
```

```ruby:出力結果
貴田
32歳
月収60万円

勉
33歳
月収80万円
```

それぞれ出力に成功したらOKです！

これでエンジニアごとに情報をもたせる事ができました。

<h2>演習問題6</h2>
６－１.魚（fish）というclassにマグロとシャケという名前(name)と「シャケが500円」、「マグロが1000円」で値段(price)を出力してください！

<h2>クラスの中でメソッドを作ろう</h2>

クラスの中ではメソッドを定義することが可能になります。
では早速記述していきたいと思います

```ruby:paiza.io
class Engineer
  attr_accessor :name
  attr_accessor :age
  attr_accessor :money

# coolメソッドを定義します。
  def cool
    # このメソッドが呼び出されたら、下記の文字列を出力します。
    puts "イケメンエンジニア"
  end

end

engineer_1 = Engineer.new

# インスタンスに名前の情報を追加します。
engineer_1.name = "貴田"

# インスタンスに価格の情報を追加します。
engineer_1.age = "#{32}歳"

# インスタンスに月収の情報を追加します。
engineer_1.money = "月収#{60}万円"

engineer_1.cool
puts engineer_1.name
puts engineer_1.age
puts engineer_1.money

```

```ruby:出力結果
イケメンエンジニア
貴田
32歳
月収60万円
```

このようにインスタンス（または代入された変数）.メソッド名

と記述することで定義したメソッドが呼び出せます。

このインスタンスに対して呼び出すメソッドのことを、インスタンスメソッドと言います。

次に引数で受け取って戻り値で返すこともできます。

実際に記述していきたいと思います

```ruby:paiza.io
class Engineer
  attr_accessor :name
  attr_accessor :age
  attr_accessor :money

# coolメソッドを定義します。
  def cool(name)
    # このメソッドが呼び出されたら、下記の文字列を出力します。
    p "イケメンエンジニア#{name}"
  end

end

engineer_1 = Engineer.new

# インスタンスに名前の情報を追加します。
engineer_1.name = "貴田"

# インスタンスに価格の情報を追加します。
engineer_1.age = "#{32}歳"

# インスタンスに月収の情報を追加します。
engineer_1.money = "月収#{60}万円"

engineer_1.cool(engineer_1.name)
```

```ruby:出力結果
イケメンエンジニア貴田
```
このように、引数はメソッド内で使え、戻り値も出力できることがわかりました。

<h2>演習問題7</h2>
7－１.魚（fish）というclassにマグロとシャケという名前(name)と「シャケが500円」、「マグロが1000円」で値段(price)を出力し、インスタンスメソッドにnameの引数をいれて、「マグロを食べたい」出力してください

<h2>Selfメソッド</h2>
インスタンスメソッドの中では、特殊な変数<font>**self**</font>を使うことが出来ます。
このselfはインスタンスメソッドを呼び出したインスタンス自体を指します。

次は勉さんの情報をとりだしてみましょう！

```ruby:paiza.io
class Engineer
  attr_accessor :name
  attr_accessor :age
  attr_accessor :money

# relianceメソッドを定義します。
  def reliance
    # このメソッドが呼び出されたら、下記の文字列を出力します。
    p "#{self.name}さんは頼りになります"
  end

end

engineer_2 = Engineer.new

# インスタンスに名前の情報を追加します。
engineer_2.name = "勉"

# インスタンスに価格の情報を追加します。
engineer_2.age = "#{33}歳"

# インスタンスに月収の情報を追加します。
engineer_2.money = "月収#{80}万円"

engineer_2.reliance
```

```ruby:出力結果
勉さんは頼りになります
```

先ほど記述した引数が無くなっていることがわかりますね。

イメージ的には最終行のengineer_2が、

relianceメソッド内ではselfに置き換わっているような感じです。

ですので、self.nameやself.ageといった記述が可能になっています。

selfを使うと引数を設定するよりもスマートにインスタンスの値が取り扱えることがわかりますね。


<h2>case(ケース)メソッド</h2>
case(ケース)メソッドはオブジェクトが複数の候補のどれに値するのか？
を判断して条件分岐させる際につかうメソッドです。


```ruby:paiza.io

value = 5

symbol = case value

when 1
  :one
when 2
  :two
when 3
  :three
when 4
  :four
when 5
  :five
end

puts symbol

```


```ruby:出力
five
```

5がバリューに入っていて、出力がfiveと出ていますね！
このプログラムは数字を英語で判別するプログラムになっています。
最初のvalueで指定したキーを評価（判断）し、一つの値を比較して条件分岐を行う場合に使われます。

次はstring型（文字列）で見てみましょう！


```ruby:paiza.io

value = 'マグロ'

buy = case value

when 'リンゴ', 'なし', 'キウイ', 'もも'
  '果物'
when 'キャベツ', 'トマト', 'ネギ'
  '野菜'
else
  '該当なし'
end

puts buy

```

```ruby:出力
該当なし
```

ここでは、elseの文が使われています！
valueの値がマグロのため野菜でも果物でもなく、elseの下の「該当なし」が呼び出されている事がわかります！

この中だと、valueの値が'リンゴ'か'なし'か'キウイ'か'もも'だと「果物」が出力され、
valueの値が'キャベツ'か'トマト'か'ネギ'だと「野菜」が出力されます！

<h2>演習問題8</h2>
8－１.case文を使って、マグロとタイとシャケが魚で、牛と豚と羊が肉の選択肢を作り、牛を選択して肉を出力してください！




お疲れ様でした！
ここはかなり重要な所です(^.^)

難しいですが、頑張って習得していきましょう！