【Progate:Rubyコース終了】引っ掛かりそう・忘れそうなところ

（結局びっしりかいてしまった。。。）
# #を使うのは２カ所。
コメントを入れる場合と変数を文字列に含める場合。

```ruby
#コメントです。

name = "げすと"
puts "こんにちは#{name}さん"

#ダメな例#
puts 'こんにちは#{name}さん'    #シングルクオーテーション（'）だとそのまま文字列になっちゃう。
```


# 変数が２語以上＝アンダーバーで区切る。


```ruby
user_name    #userNameではない。
```

#条件分岐は、if,elsif,else,end
#かつ→&&、または→||
#配列→ names = ["Aさん", "Bさん", "Cさん",]
#繰り返し
```ruby
names.each do|name|
  puts "名前は#{name}です"
end
```

#ハッシュ
```ruby
user = {キー1 => 値1, キー2 => 値2}
#要素を追加↓
user[キー3] = 値3
```
###ハッシュの別の書き方
```ruby
#元のサンプル
user ={"name" => "Suzuki", "age" => 21}

#キーにシンボルという書き方を使う。文字列"name"的なもの（厳密には違う）。
user ={:name => "Suzuki", :age => 21}
puts user[:name]

#さらにその省略バージョン
user = {name: "Suzuki", age: 21}
puts user[:name]    #元はシンボルだから頭にセミコロンが必要。
```
#nil（ニル）←何もないの意
ハッシュから存在しないキーを取り出した場合。
任意項目として"age"というキーを設定したが、空欄だった場合などに「年齢は秘密です」などと条件分岐でメッセージを出したり。。。（適当）

#配列にハッシュを入れることもできる。
```ruby
users = [
  {name: "Suzuki", age: 21}
  {name: "Kato", age: 14}
]
#この場合の要素の取り出し方は、配列[インデックス番号][キー]
puts users[0][:name]
```

#メソッド→複数の処理をまとめたもの。
#メソッド基本
```ruby
def introduce(name, age)    #nameは第一引数という。
  puts "私は#{name}です"
  puts "#{age}歳です"
end
introduce    #これだけで実行できる。（putsは要らない。）
```

#戻り値
メソッドの処理結果を呼び出し元で受け取る。「メソッドが戻り値を返す」。←(゜Д゜) ハア??
以下ではaddメソッドが「1」と「3」を受け取り、処理結果の「4」を呼び出し元に返している。
この「4」にあたるのが戻り値。

```ruby
def add(a,b)
  return a + b
  puts "(V)o￥o(V)"
  #↑returnはメソッドの処理を終了させるので、これは実行されない。
  #だからバルタン星人を書いても大丈夫＾＾
end
puts add(1,3)    #putsがないと4が出力されない。

#ちなみに…
def add(a,b)
  puts a + b
end
add(1,3)    #putsがなくても4が出力される。
```
add(1, 3)は単に「戻り値を受け取った」に過ぎないから、そのままでは何の動作も起こしませんよ、ってことだなたぶん。(+_+)
数値をそのまま「4」って記述してもだめで、「puts 4」ってしないとダメなのと同じだな。

#キーワード引数
引数があんまり多いようなら、指定しちゃえばいいじゃない！ってやつ。

```ruby
def introduce_all(name:, age:, height:, weight:, favarite_food:)
                 #引数名の後に「:」を付ける。
  puts "私は#{name}、#{age}歳です"
  puts "身長#{height}センチ、体重#{weight}キロ"
  puts "#好きな食べ物は#{favarite_movie}歳です"
end
introduce(favarite_movie: "どら焼き",height: 129.3, weight: 129.3...)
#「引数名: 引数」ってな感じでおｋ。
```

#クラスとインスタンス
クラスは空の設計図。ひな形的なもの。
インスタンスはモノ（現物的なもの）。
クラス（ひな形）からインスタンス（現物）を生成して、情報を追加していく。
（インスタンスは直訳で「事例」）

```ruby
class Menu #大文字から始める
  attr_accessor :name    #シンボルなので、コロンはnameに寄せる。
                         #nameインスタンス変数という。
end　#これでクラスができた。

menu1 = Menu.new    #「Menu.new」でインスタンスを生成し、変数（menu1）に代入している。
```
##インスタンス変数へ代入
```ruby
class Menu
  attr_accessor :name
end
menu1 = Menu.new
menu1.name = "すし"    #インスタンス変数に情報を代入している。
```

##インスタンスメソッド
```ruby
class Menu
  attr_accessor :name
  def show #インスタンスの中でメソッド定義
    return "#{self.name}食いねぇ"    #インスタンスメソッドの中では「self.変数名」とする。
  end
end

menu1 = Menu.new
menu1.name = "すし"
puts menu1.show
```
selfとはインスタンス自身のことなので、Menu.name的なイメージ。
（実際にはMenu.newでインスタンスは生成されるのであくまでイメージ）

##initializeメソッド
インスタンス生成直後に実行されるメソッド。

```ruby
class Menu

  def initialize
    self.name = "すし"    #これもインスタンスメソッドなのでself.変数名となる。
  end

end

menu1 = Menu.new    #このインスタンス生成直後にdef initializeが実行される。
```

#require
ファイルを分けた時に呼び出す命令

```ruby
require "./menu"
```

#入力してもらう。
```ruby
name = gets.chomp    #だいたいすぐ変数などに代入する。
order = get.chomp.to_i    #「.to_i」を付けると、文字列から数値に変換できる。
```

#クラスの継承・オーバーライド
```ruby
require "./manu"   #親クラスのファイルを呼び出して、、、

class Food < Menu    #子クラス生成時に、親クラスを指定する。

  attr_accessor :calorie    #親クラスにない変数はここで追加できる。

  def calorie_info    #同じくメソッドも追加できる。
    #処理#
  end

  def info    #親クラスと同じメソッドを指定したら、上書きされて子クラスのメソッドが実行される。
    #処理#
  end
end
```

##super
もしも重複部分がある場合は、

```ruby
require "./manu"

class Food < Menu
  attr_accessor :calorie

  def initialize(name:, price:, calorie:)    #initializeメソッドを上書きしつつ、
    super(name: name, price: price)    #nameは親クラスのname,priceも親クラスのnameという指定をすれば、重複部分は省略できる。
    self.calorie = calorie
  end
end
```

ちなみに上は、親クラスのinitializeメソッドで

```ruby
def initialize(name:, price:)
  self.name = name
  self.price = price
end
```
という代入が行われている前提。

#Dateクラス
最初から用意されているクラスなので、定義不要。

```ruby
require "date"    #Dateクラスの読み込み
#"./date"や"Date"ではない。

date1 = Date.new(2018, 12, 3)    #Dateクラスのインスタンスを生成
date1 = Date.today    #今日の日付のインスタンスを生成
puts date1.sunday?    #日曜日かどうかの真偽値を返すインスタンスメソッド
```
#クラスメソッド
クラスに対して呼び出すメソッド。インスタンスに対して呼び出すインスタンスメソッドとの違いに注意。

```ruby

class Menu

  def Menu.is_discount_day?    #インスタンスメソッドと異なり、「クラス名.」が必要
                               #「クラス名.」はクラスに対して呼び出してますよということ
    today = Date.today
  end

  def get_total_price
    if Menu.is_discount_day?     #get_total_priceというインスタンスメソッドの中でも呼び出せる。
      #処理
    end
  end
end

date1 = Date.today    #先ほどのこれもクラスメソッド
                      #クラスであるDateに対して呼び出している。
```