Rubyのハッシュとシンボルについて

# プログラミングの勉強日記
2020年7月9日　Progate Lv.162
RubyⅠ RubyⅡ
今日からRubyの勉強を始める。1ヶ月後にでRuby on Railsを用いてアプリを作れるように勉強していく。

#Rubyとは
　Qiitaでは初めてRubyについて触れるので、最初に簡単にRubyの説明と簡単な使い方について説明する。
　RubyはWebアプリケーションのシステムを作るためのプログラミング言語で、似たような言語ではPHPやPythonなどがある。
　本題のハッシュに入る前に簡単にRubyの使い方について説明する。

##変数の定義
　`変数名=値`で変数の定義を行うことができる。基本的な使い方は他のプログラミング言語と同じ。変素名は何の値が代入されているかわかりやすい名前にする。<font color=blue>2語以上の組み合わせる変数名にはアンダーバー`_`を用いる。</font>

##変数展開
　文字列の中で`#{変数名}`とすることで変数を代入している値に置き換えて文字列を含めることを変数展開という。<font color=blue>変数展開を行う場合は必ずダブルクオーテーション`"`で囲む。</font>シングルクォーテーションの場合、変数展開が行われず、そのまま文字列として扱われてしまう。また、数字と文字列は`+`で文字連結できないので、そうゆう場合でも変数展開を用いる。

```ruby:index.rb
name="田中"
puts "名前は#{name}です"
puts '名前は#{name}です'
```

```:コンソール
名前は田中です
名前は#{name}です
```
　
##if文の書き方
　処理は`if`と`end`で囲む。C言語では`else if`が使われるがRubyでは`elsif`を用いる。

##繰り返しの処理
　each文を使う。`配列.each do |変数名|`と書き、`end`までの間に実行したい処理を書く。

```ruby:index.rb
names=["田中","山本","山田"]
names.each do |name|
  puts name
end
```

```:コンソール
田中
山本
山田
```

　each文内の変数名(name)は好きな名前でいいが、配列の変数名(names)の単数形にすることが多い。
　<font color=blue>`|変数|`はeach文のdoからendまでしか使えない。</font>each文の外で定義した変数はeach文の中でも使うことができる。それぞれの変数の使用できる範囲を<font color=orange>スコープ</font>という。

#ハッシュとは
　複数の値を管理する方法の1つ。配列は複数の値を並べて管理するのに対して、ハッシュはそれぞれの値にキープという名前をつけて管理する。
<img width="641" alt="0709.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/aaaba229-5195-ee5f-d0e9-9464cc017ef6.png">

```ruby:index.rb
user={"name"=>"田中", "age"=>16}
puts user
```

```コンソール
user={"name"=>"田中", "age"=>16}
(↑定義したハッシュがそのまま出力される)
```

#ハッシュの要素を用いる
　ハッシュの各要素の値は対応するキーを使って`ハッシュ[キー]`とすることで用いられる。また、`ハッシュ[キー]=値`で更新できる。`ハッシュ[新しいキー]=値`で追加することもできる。

```ruby:index.rb
user={"name"=>"田中", "age"=>16}
puts user["name"]

#キー"age"に対する値を更新
user["age"]=17
puts user

#キー"gender"に対する値を追加
user["gender"]=male
puts user
```

```:コンソール
田中
user={"name"=>"田中", "age"=>17}
user={"name"=>"田中", "age"=>17, "gender"="male"}
```

#シンボル
　ハッシュのキーの部分を文字列ではなく先頭にコロン`:`を付けた書き方。つまり、クォーテーションで囲む代わりに先頭にコロンをつける。クォーテーションで囲む場合と先頭にコロンをつける場合で出力結果は同じになる。文字列とシンボルは厳密には違うけど、基本的には同じように使える。
　ハッシュのキー部分でシンボルを用いたらその値を用いるときはシンボルで指定しなければいけない。

```ruby:index.rb
user={"name"=>"田中", "age"=>17}
puts user["name"]

user={:name=>"田中", :age=>17}
puts user[:name]
```

　<font color=red>【一般的】</font>ハッシュのキーにシンボルを用いるときは省略して書くことができる。この書き方が一般的である。省略した場合でも、シンボルを用いて要素を取得する。

```ruby:index.rb
user={name:"田中", age:17}
puts user[:name]
```

#nilの扱い
　ハッシュから存在しないキーの値を取り出したときの「何もない」という値のこと。読み方は「ニル」。putsしても何も表示されない。

```ruby:index.rb
user={name:"田中", age:17}
puts user[:height]
```

#要素がハッシュである配列
　配列の要素にはハッシュを使うことができる。
　`配列[インデックス番号]`でハッシュを用いることができるので、そのハッシュを代入した変数を使って`変数[キー]`でハッシュの要素の値を用いられる。

```ruby:index.rb
users=[
  {name:"田中", age:17}
  {name:"山本", age:20}
]
puts users[0]

user=users[0]
puts user[:name]
```

```:コンソール
{:name=>"田中", :age=>17}
田中
```

　上のを省略して書くことができる。`配列[インデックス番号][キー]`で特定のハッシュの値を用いることができる。

```ruby:index.rb
users=[
  {name:"田中", age:17}
  {name:"山本", age:20}
]

puts users[1][:name]
```

```:コンソール
山本
```

　each文を使って書くこともできる。

```ruby:index.rb
users=[
  {name:"田中", age:17}
  {name:"山本", age:20}
]

users.each do |user|
  puts user
end

users.each do |user|
  puts user[:name]
end
```

```:コンソール
{:name=>"田中", :age=>17}
{:name=>"山本", :age=>20}
田中
山本
```