【Progate】Ruby 学習コース 要点メモ【自分用】

#Ruby 学習コースⅠ

Progateの学習において、自分用のメモがてらアウトプットしてみる

##『変数』
プログラミングの世界では数字と文字列は別物。

『変数』とは値を入れておく箱のようなもの
「=」は等しいという意味ではなく、左側の変数に右側の値を入れるという意味で、これを『代入』という
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478616/4c80e032-105a-826a-bc96-2473f19f4a9d.png)

変数のメリットは、以下の通り。
・同じ要素を繰り返し使える
　→似た文を繰り返し書く場合、共通する値を代入し利用することでコードが書きやすくなる
・変更に対応しやすい
　→コードに変更がある場合、代入する値を変更してあげれば容易に対応できる
・何の要素かわかりやすい
　→代入する値と関連付けて変数名を付けると、何の要素であるかわかりやすい

###変数のルール
2語以上の単語を用いる場合は、なるべく「英語」_(アンダーバー)「英語」の形にする。
GOOD例)
  user_name
BAD例)
  1user(数字からスタートするとエラーが出る)

###変数更新
同じ変数を更新させる場合は、以下の通りに省略できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478616/71f1b413-4a3b-f8f2-73a1-5dae0ae6167f.png)

###変数展開
変数に代入された数値と文字列を同時に出力させたい場合は、

```
#{変数名}　
```

を用いる

##『if文』
「もし［条件］なら［処理］を行う」　というプログラムを実行させるときのコードは以下の通り

```
if ［条件式］
　［処理］
end
```


###真偽値
条件式は、成り立つと「true」に置き換わる
条件式が成り立たないと「false」に置き換わる

###比較演算子
a > b(大小比較)
a == b(aとbが等しいときtrue)
a != b(aとbが異なるときtrue)

###かつ,または
&&を用いる
score>10 && score<30 （10より大きいかつ30より小さい
||を用いる
条件1 || 条件2（条件1または条件2が）

#Ruby 学習コースⅡ
##『配列』
複数の値をまとめて管理するには、配列というものを用いる。

```
[値1,値2,値3,]

#例)文字列をまとめた配列↓
["田中","加藤","鈴木"]

#例)数値をまとめた配列↓
[11,45,14]
```

###インデックス番号
配列の要素には、前から順に数字が順番に振られており、これをインデックス番号という。
※インデックス番号は0から始まるので注意！
配列の各要素は、配列[インデックス番号]とすることで用いることができる

```
languages = ["日本語", "英語", "スペイン語"]

puts languages[1]
```
##『each文(繰り返し処理)』
繰り返し処理には、each文を用いる。
配列の要素を順番に取り出して処理を行うことができる。
each文は、図のように、「配列.each do |変数名|」と書き、「end」までの間に実行したい処理を書く。

```index.rb
languages = ["日本語", "英語", "スペイン語"]

# each文を用いて、要素ごとに「○○を話せます」と出力してください
languages.each do |language|
  puts "#{language}を話せます"
end
```

each文の外で定義した変数は、each文の中でも使うことができる。
下の図の例では、変数borderはeach文の外で定義されていますので、each文の中でも外でも使うことができる。

```index.rb
languages = ["日本語", "英語", "スペイン語"]
border = "---------------------"

languages.each do |language|
  # 変数borderを出力してください
  puts "#{language}を話せます"
  puts border
end
```

###ハッシュの書き方

```index.rb
#キーが文字列の書き方
{"name"=>"Suzuki","age"=>21}
#キーがシンボルの書き方
{:name=>"Suzuki",:age=>21}
#キーがシンボルの書き方(省略系)←一番良く使うので覚えておくこと！
{name:"Suzuki",age:21}
```

###nil
ハッシュから存在しないキーの値を取り出した時の値は、「nil」(ニル)という表現がされる

```index.rb
exam = {subject: "Math", score: 80}

# キー「:grade」の値を出力してください
puts exam[:grade]

# nilを出力してください
puts nil
```

###nilの回避
if~else文は、nilの場合もelseとして処理される

```index.rb
exam = {subject: "Math"}

# 条件式にキー「:score」の値を使うif文をつくってください
if exam[:score]
puts "#{exam[:subject]}の結果は#{exam[:score]}点です"
else
  puts "#{exam[:subject]}の結果は分かりません"
end
```

###eachの中でハッシュの値を使う
配列の要素を順番に取り出して処理を行うためのeach文は以下のようになる。

```index.rb
exams = [
  {subject: "Math", score: 80},
  {subject: "Science", score: 55}
]

# each文を用いて、要素ごとに「○○の結果は△△点です」と出力してください
exams.each do |exam|
puts "#{exam[:subject]}の結果は#{exam[:score]}点です"
end
```
#Ruby学習コースⅢ
##メソッド
メソッドとは複数の処理をひとつにまとめたもの

```index.rb
def メソッド名
～～～処理～～～
end

↓

def introduce
  puts"こんにちは"
  puts"私はにんじゃわんこです"
end
```
###メソッドの呼び出し
メソッド名を表示させることでメソッドは実行される

```index.rb

def introduce
  puts"こんにちは"
  puts"私はにんじゃわんこです"
end
introduce #メソッドの呼び出し
```

##引数

引数（ひきすう）とはメソッドに与える追加情報のようなもの
引数はメソッド内では変数のように使用することができる。

```index.rb
def introduce(name)
  puts "こんにちは"
  puts "私は#{name}です"
end

# 引数を渡してメソッドを呼び出してください
introduce("にんじゃワンコ")
```

###メソッド定義のスコープ
メソッドを定義するときに用意した引数は、def~end の間まででしか使えない。
また、変数も同じ。

```index.rb
def introduce(name)
  message = "私は#{name}です"
  puts message#メソッド内だから使える（スコープ内）
end
  puts message#メソッド内だから使えない（スコープ外）
```

###複数の引数
引数は複数受け取ることができ、（）に受け取る引数を,で区切って並べることで、複数の引数を指定できる

```index.rb
# 引数priceも受け取るように変更してください
def print_info(item,price)
  puts "わんこでんきへようこそ！"
  puts "今日は#{item}がセール中で#{price}円です！"
end

# print_infoメソッドを呼び出してください
print_info("SDカード",1200)
```

##戻り値
メソッドの中で**return**を使うと処理結果（**戻り値**）を呼び出し元で受け取ることができる

```index.rb

def メソッド名
  return 値
end

#↓実際に書くとこんな感じ↓

def discount(price)
	return price / 2　#「price / 2」を戻り値として返す
end
puts "テレビがセール中です！"
half_price=discount(15000)#discountメソッドの戻り値を変数half_priceに代入
puts "特別定価で#{half_price}円です"#「特別価格で〇〇円です」となるように出力

```
###真偽値を用いた戻り値
if文で使うような条件式をreturnすると、その条件式の結果として得られる真偽値（trueまたはfalse）を返すことができる

```index.rb

def shipping_free?(price)
  return price >= 5000
end
if shipping_free?(3000)
	puts "5000円以上のお買い上げなので送料はいただきません"
else
	puts "追加で送料をいただきます"
end

```

###returnによる処理の終了
returnは、戻り値を返すだけでなくメソッドの処理を終了させる性質も持っている。
つまり、returnの後にあるメソッドの処理は実行されない

```index.rb

def price_with_shipping(price)
	if price >= 5000 #priceが5000以上のとき、戻り値としてpriceを返す
	  return price
	end
	return price+500 #priceに500を加えた値を戻り値として返す
end

puts "商品の合計金額は3000円です"
puts "お支払い金額は、送料込みで#{price_with_shipping(3000)}円です"
puts "-----------"
puts "商品の合計金額は10000円です"
puts "お支払い金額は、送料込みで#{price_with_shipping(10000)}円です"
```

##キーワード引数
呼び出し側で引数を明記することができる
【書き方】
① 定義側で、引数の後にコロンを付ける
② 呼び出し側で、値の前に引数名を書く

```index.rb
def buy(item:, price:, count:) #キーワード引数を使うように書き換え
	puts "#{item}を#{count}台のお買い上げです"
	puts "合計金額は#{price * count}円です"
end

buy(item:"テレビ", price:15000, count:2) #キーワード引数を使うように書き換え

```

#Ruby学習コースⅣ
##クラスとインスタンス
プログラミングでメニューという「もの」を生成するには、まずその「設計図」を用意する必要がある。
設計図のことを**クラス**、「もの」のことを**インスタンス**と呼ぶ。
##クラスの定義
クラスは「class クラス名」とすることで定義できる。
クラス名は必ず大文字で始めることと、「end」を書く必要がある。

```index.rb
class Menu# Menuクラスを定義i

end

```

###インスタンス変数
クラスに情報を持たせるためには、「attr_accessor シンボル」のようにする。
以下の図のようにすることで、Menuクラスのインスタンスにname（インスタンス変数）という情報を持たせることができる。

```index.rb
class Menu
  attr_accessor :name #nameというインスタンス変数を用意
  attr_accessor :price #priceというインスタンス変数を用意 
end

```

###インスタンスの生成
クラス（設計図）を元に、新しくインスタンスを生成するには、「クラス名.new」とする。
また、「変数名 = クラス名.new」とすることで、生成したインスタンスを変数に代入することができる。

```index.rb
class Menu
  attr_accessor :name
  attr_accessor :price
end

menu1=Menu.new #Menuクラスのインスタンスを生成して変数menu1に代入

```

###インスタンスに情報を追加

クラスで用意したインスタンス変数に値を代入する場合、「インスタンス.変数名 = 値」とすることで、そのインスタンス変数に値をセットすることができる。
また、「インスタンス.変数名」とすることで、そのインスタンス変数の値を用いることができる。

```index.rb
class Menu
  attr_accessor :name
  attr_accessor :price
end

menu1=Menu.new #Menuクラスのインスタンスを生成して変数menu1に代入

```

##インスタンスメソッド
クラスの中で定義したメソッドは、インスタンスに対して使うようにして呼び出す。
具体的には、「インスタンス.メソッド名」のようにすることで、そのメソッドを呼び出すことができる。

```index.rb
class Menu
  attr_accessor :name
  attr_accessor :price
  
  def info #infoメソッドを定義
    puts "料理名と値段が表示されます"
  end
end

menu1 = Menu.new
menu1.name = "ピザ"
menu1.price = 800

menu1.info #menu1に対してinfoメソッドを呼び出す

```

###インスタンスメソッドの応用
インスタンスメソッドの中では、特殊な変数「**self**」を用いて「self.変数名」とすることで、インスタンス変数を扱うことができるようになる。
インスタンスメソッドでは、変数「self」に、呼び出したインスタンス自身が代入されている。

```index.rb
class Menu
  attr_accessor :name
  attr_accessor :price
  
  def info
    return "#{self.name} #{self.price}円"
  end
end

menu1 = Menu.new
menu1.name = "ピザ"
menu1.price = 800

puts menu1.info

```

###if文を用いたインスタンスメソッド


```index.rb
class Menu
  attr_accessor :name
  attr_accessor :price
  
  def info
    return "#{self.name} #{self.price}円"
  end
  
  # get_total_priceメソッドを定義してください
  def get_total_price(count)
    total_price=self.price*count
    if count>=3
      total_price=total_price-100
    end
    return total_price
  end
end

menu1 = Menu.new
menu1.name = "ピザ"
menu1.price = 800

# menu1に対してget_total_priceメソッドを呼び出してください
puts menu1.get_total_price(3)
```

###initializeメソッド
インスタンスを生成した直後に処理を実行することができる。つまり、「クラス名.new」でインスタンスを生成した直後にinitializeメソッドが呼び出され、その中の処理が実行される。
またインスタンスメソッドの中では、「self.変数名」でインスタンス変数を扱うことができるので、「self.変数名 = 値」でインスタンス変数に値を代入できる。

```index.rb
class Menu
  attr_accessor :name
  attr_accessor :price
  
  def initialize # initializeメソッドを定義
    self.name="ピザ"
    self.price=800
  end
  
  def info
    return "#{self.name} #{self.price}円"
  end
  
  def get_total_price(count)
    total_price = self.price * count
    if count >= 3
      total_price -= 100
    end
    return total_price
  end
end

menu1 = Menu.new

puts menu1.info# menu1に対してinfoメソッドを呼び出して戻り値を出力
```

###initializeメソッドの引数
nitializeメソッドは通常のインスタンスメソッドと同じように、引数を渡すこともできる。
その際、「クラス.new」に対して引数を渡すことで、initializeメソッドにその値を渡すことができる。

```index.rb
class Menu
  attr_accessor :name
  attr_accessor :price
  
  # initializeメソッドでnameとpriceに引数を受け取る
  def initialize(name:,price:)
    self.name = name
    self.price = price
  end
  
  def info
    return "#{self.name} #{self.price}円"
  end
  
  def get_total_price(count)
    total_price = self.price * count
    if count >= 3
      total_price -= 100
    end
    return total_price
  end
end

# 引数を渡してインスタンスを生成
menu1 = Menu.new(name:"ピザ",price:800)
menu2 = Menu.new(name:"すし",price:1000)

puts menu1.info
puts menu2.info

```

##料理注文システムの作成
###ファイルの分割
```index.rb
require "./menu" #menu.rbの読み込み

menu1 = Menu.new(name: "すし", price: 1000)
puts menu1.info

```

```menu.rb
# ここにMenuクラスを貼り付け
class Menu
  attr_accessor :name
  attr_accessor :price
  
  def initialize(name:, price:)
    self.name = name
    self.price = price
  end
  
  def info
    return "#{self.name} #{self.price}円"
  end
  
  def get_total_price(count)
    total_price = self.price * count
    if count >= 3
      total_price -= 100
    end
    return total_price
  end
end

```

###①インスタンスの配列
Menuクラスから生成したインスタンスも、配列の要素にすることが可能。
下記コードのように各インスタンスを要素とする配列を変数menusに代入し、その配列に対してeach文を用いることで、それぞれのメニューを表示する。

```index.rb

require "./menu"

menu1 = Menu.new(name: "ピザ", price: 800)
menu2 = Menu.new(name: "すし", price: 1000)
menu3 = Menu.new(name: "コーラ", price: 300)
menu4 = Menu.new(name: "お茶", price: 200)

# 変数menusを定義して配列を代入
menus =[menu1,menu2,menu3,menu4]

# menusに対して繰り返し処理を実行
menus.each do |menu|
  puts menu.info
end
```
###②繰り返し処理で番号をつける
番号をつけるには、番号を保存するための変数（図の例では変数index）をeach文の外で用意して、each文の処理の中で値を1だけ増やして更新するようにする。

```index.rb
require "./menu"

menu1 = Menu.new(name: "ピザ", price: 800)
menu2 = Menu.new(name: "すし", price: 1000)
menu3 = Menu.new(name: "コーラ", price: 300)
menu4 = Menu.new(name: "お茶", price: 200)

menus = [menu1, menu2, menu3, menu4]

# 変数indexを定義して「0」を代入
index=0

menus.each do |menu|
  # 番号をつけてメニューの内容が出力されるように書き換える
  puts "#{index}. #{menu.info}"
  # 変数indexに1を加えて値を更新
    index+=1
end
```

###入力を受け取る(gets.chomp)
入力を受け付けるには「gets.chomp」を使う。このコードが実行されると、コンソールが入力待機状態となる。
「変数 = gets.chomp」とすることで、エンターキーを押されるまでに入力された値を変数に代入することができる。
ただし、「**変数 = gets.chomp**」のままだと文字列のままになってしまうため、数値を入力したい場合は「**gets.chomp.to_i**」と入力する必要がある。

```index.rb

puts "名前を入力してください"

# 入力を受け取って変数nameに代入
name=gets.chomp
puts "#{name}さん、いらっしゃいませ"
puts "1つ100円のお菓子があります"
puts "いくつ買いますか?"

# 入力を数値として受け取って変数countに代入
count=gets.chomp.to_i

# 変数total_priceに、100とcountを掛けた値を代入
total_price=100*count
puts "お会計は#{total_price}円です"
```

###料理注文メニューの完成

```index.rb
require "./menu"

menu1 = Menu.new(name: "ピザ", price: 800)
menu2 = Menu.new(name: "すし", price: 1000)
menu3 = Menu.new(name: "コーラ", price: 300)
menu4 = Menu.new(name: "お茶", price: 200)

menus = [menu1, menu2, menu3, menu4]

index = 0
menus.each do |menu|
  puts "#{index}. #{menu.info}"
  index += 1
end

puts "--------------"
puts "メニューの番号を選択してください"

# 入力を数値として受け取って変数orderに代入
order=gets.chomp.to_i

# 選択されたメニューのインスタンスを変数selected_menuに代入
selected_menu=menus[order]

# 「選択されたメニュー: ○○」となるように出力
puts "選択されたメニュー: #{selected_menu.name}"

puts "個数を入力してください(3つ以上で100円割引)"

# 入力を数値として受け取って変数countに代入
count=gets.chomp.to_i

# 「お会計は○○円です」となるように出力
puts "お会計は#{selected_menu.get_total_price(count)}円です"

```
#Ruby学習コースⅤ
##継承
クラスを元にして新たなクラスをつくることを「継承」と呼ぶ。
「class 新しいクラス名(子クラス) < 元となるクラス名(親クラス)」とすることで他のクラスを継承して、新しいクラスを定義することができる。

```food.rb
# requireを使ってmenu.rbを読み込み
require "./menu"

# Menuクラスを継承したFoodクラスを作成
class Food<Menu
end
```
###子クラスのインスタンス
子クラスは親のインスタンス変数とインスタンスメソッドを引き継ぎ、呼び出すことができる。

```index.rb
# requireを使ってfood.rbとdrink.rbを読み込む
require "./food"
require "./drink"

# Foodクラスのインスタンスを生成して変数food1に代入
food1=Food.new(name:"ピザ",price:800)

# food1に対してinfoメソッドを呼び出して戻り値を出力
puts food1.info

# Drinkクラスのインスタンスを生成して変数drink1に代入
drink1=Drink.new(name:"コーラ",price:300)

# drink1に対してinfoメソッドを呼び出して戻り値を出力
puts drink1.info

```

###子クラスにインスタンス変数を追加
これまでと同様に「attr_accessor」を用いる

###子クラスにインスタンスメソッドを追加
これまでと同様に

```子クラス.rb
def メソッド名
end
```
とする


```food.rb
require "./menu"

class Food < Menu
  attr_accessor :calorie
 
  # calorie_infoメソッドを定義
  def calorie_info
    return "#{self.name}は#{self.calorie}kcalです"
  end
end

```
```index.rb
require "./food"
require "./drink"

food1 = Food.new(name: "ピザ", price: 800)
food1.calorie = 700

# food1に対してcalorie_infoメソッドを呼び出して戻り値を出力
puts food1.calorie_info
```
###オーバーライド
親クラスにあるメソッドと同じ名前のメソッドを子クラスで定義すると、メソッドを上書きすることができる。（**オーバーライド**）
オーバーライドをすると子クラスのインスタンスは親クラスのメソッドではなく、子クラスで新しく定義したメソッドを呼び出すようになる。（同名のメソッドがある場合は子クラスを呼び出すようになる）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478616/75988b14-a69e-d402-fd34-1f6832007220.png)

###メソッド内の重複
オーバーライドしたメソッドの中で「super」とすることで、親クラスの同名のメソッドを呼び出すことができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478616/2837abdf-454c-abc9-5672-6b4f4a9d8826.png)

##Dateクラス(require)
日付を扱う場合**Date**クラスを用いる。Date.newとすることでインスタンスを生成することができる。

```index.rb
# requireを用いて、Dateクラスを読み込む
require "date"

# 変数birthdayに、Dateクラスのインスタンスを代入
birthday=Date.new(1991,12,24)

# 変数birthdayを出力
puts birthday

# 変数birthdayにsunday?メソッドを用いた結果を出力
puts birthday.sunday?

```
###今日の日付のDateインスタンス取得
Dateクラスでは、Date.todayとすることで、今日の日付のインスタンスをつくることができるようになっています。

```index.rb
require "date"

# 変数todayに、Date.todayの戻り値を代入
today=Date.today

# 変数todayを出力
puts today

# 変数todayに対してsunday?メソッドを用いた結果を出力
puts today.sunday?
```

###クラスメソッド
クラスメソッドは、「def クラス名.メソッド名」とすることで定義できる。インスタンスメソッドとの違いはメソッド名の前にクラス名を書く必要がある。
Menuクラスに「is_discount_day?」というクラスメソッドを定義すると、今日の日付が日曜日かどうかを真偽値で返す処理となる

```menu.rb
# requireを用いて、Dateクラスを読み込んでください
require "date"

class Menu
  attr_accessor :name
  attr_accessor :price

  def initialize(name:, price:)
    self.name = name
    self.price = price
  end
  
  def info
    return "#{self.name} #{self.price}円"
  end
  
  def get_total_price(count)
    total_price = self.price * count
    if count >= 3
      total_price -= 100
    end
    return total_price
  end
  
  def Menu.is_discount_day?
    # 日曜日であればtrue、そうでなければfalseを返してください
    today=Date.today
    return today.sunday?
  end
end
```
###クラスメソッドを呼び出す
クラスメソッドはクラスの中でも、同じように呼び出すことができる。
今回は、Menuクラスのインスタンスメソッドである「get_total_price」メソッドの中で、クラスメソッド「is_discount_day?」を呼び出してみる。
ちなみに、インスタンスに対して呼び出すメソッドは「インスタンスメソッド」、クラスに対して呼び出すメソッドは「クラスメソッド」である。