Chiroru's Diary

日々の学びをちょこちょこメモしていきます

【ゼロからわかるRuby超入門2】Ruby 条件分岐、配列

【目次】

3-1 条件判断

比較メソッド

  • 「==」:等しいときにtrue
  • 「!=」:等しくないときにtrue
  • 「(booleanを返すメソッドの場合)末尾に ?」:trueかfalse

3-2条件を満たした時の処理

後置if

「end」を書く必要なし。

条件を満たさないunless(⇄if)

条件を満たさないときに処理をし、満たすときは何もしない

結果を反転する「!」

これがあると、true・falseをひっくり返す。
「!」 は、変数やオブジェクトの前につけること。

x = false  
if !x ←「!x=true」  だからifは処理する。  
unless x ←「x = false 」でunlessは処理する。  

参照:81

3-3条件を満たさないときにも処理する

ifの分岐が2つのときは「else」、3つ以上は「elsif」を使用する。

3-4複数の条件を組み合わせる

または「||」・かつ「&&」

AまたはBの時に処理 / AかつBの時に処理

if A || B
end

if A && B
end

3-5複数の中から1つ選択

ifは2択(true or false)。3択以上になった時。

case

case 変数 ←1つ選ぶ    
when A  
  変数=Aの時の処理  
when B  
  変数=Bの時の処理  
else 合致なしの時の処理  
end

また「case 変数」の変数をなくして「case」のみにすれば、一致以外の条件を書くことができる。(順にwhenの処理して一致したら処理)

3-6繰り返し

繰り返し処理など、重複を避けるプログラムを書く習慣を「DRY」。

決まった数繰返すtimes

「do~end」=「{ }」 は、「ブロック」。処理のかたまりを書ける。

  • 「{ }」:一行のとき
  • 「do~end」:複数行のとき

↑暗黙的なもので、まあどちらでも使えるので注意。

n.times do
  繰り返し  
end

条件を満たしている時に繰り返すwhile

「while~end」の形式でブロックを使わない。

4-1オブジェクトをまとめて扱う

配列は、オブジェクトをまとめて扱うもののこと。また配列自身もオブジェクトであり、そのクラスは「Array」である。

[ ] 
# 空の配列  

numbers = [1, 2, 3]
# 配列を代入する変数は、「複数形」  

menus = ["コーヒー", 300]  
# 種類の異なるオブジェクトを入れてもOK

4-2要素の取得

配列を取得する際、後ろから数えることもできる。
例えば以下の場合、colors[-1]はblue、colors[-2]はpink。

colors = ["pink", "blue"]

また最初と最後の要素を取り出すには、「first」「last」メソッドを使うこともできる。
ちなみにfirst=[0]、last=[-1]。

変数名.first or last

ここまで変数に対して「.メソッド」の形で要素を取り出していたが、直接配列から取り出すこともできる(以下)

["pink", "blue"].first 
# →pinkがでる

4-3配列に要素を追加・削除

追加

  • 「push」「<<」:末尾に要素を追加したいとき
  • 「unshift」:先頭に要素を追加したいとき
colors = ["pink", "blue"]

colors.push["green"]  
colors << ["orange"]
colors.unshift["white"]

# → ["white", "pink", "blue", "green", "orange"]  

削除

  • 「pop」:末尾から要素を削除する
  • 「shift」:先頭から要素を削除する

足し算・引き算もできる

配列同士を足したり引いたりすることで、要素の合計や差分を出すことができ、その要素を持つ新たな配列ができる。

4-4配列の繰り返し

配列.each do |変数名| 
  puts 変数名  
end

途中で終わるbreak

繰り返しの処理を途中で終えるには「break」を利用する。

配列[オブジェクト1, オブジェクト2, オブジェクト3].each do |変数名| 
  break if 変数名 == オブジェクト2
  puts 変数名  
end

# 返ってくるのはオブジェクト1のみ

飛ばして次に進むnext

繰り返し処理中に、ある箇所を飛ばして処理するには「next」
(※繰り返されるブロック内での処理をそこで終わりにし、次回の繰り返しスタート)

上記の場合だと、取得できる要素は[オブジェクト1, オブジェクト3]である。

範囲指定のRangeオブジェクト

「1~3まで」のように範囲を表すオブジェクトを「Range」という。
書き方は (1..3) のようになる。

5-1配列の便利なメソッド

要素の数sizeメソッド

配列.size
# 要素の数を返す  

配列の合計値sumメソッド

配列の全要素の合計値が出したければ、「sum」メソッドを使う。(ruby2.4~)
sumは配列の中身が小数クラスFloatであれば、Floatが返ってくる。

なお配列の中身が整数オブジェクトであれば、sizeもsumも整数オブジェクトが返ってくる。これで小数の計算をしたければ、小数に変換する「to_f」メソッドをさらに書き加える必要がある。(これをメソッドチェインという)

配列.size.to_f  

5-2メソッドの機能

uniqとuniq! 2種類のメソッドについて

「uniq」はもともと重複した要素を消した配列を返すメソッド。これに!がつく「uniq!」は、同じように重複要素を排除した配列を返すものだが、以下のような違いがある。

array1 = [1,1,2]
array2 = array1.uniq
# array1 = [1,1,2]、array2 = [1,2]
# 「uniq」を使うと、2種類のオブジェクトができる。  

array1 = [1,1,2]
array2 = array1.uniq!
# array1 = [1,2]  =  array2 = [1,2]  
# 「uniq!」を使うと、オブジェクトは1種類になり、変数名だけ異なる状態となる。  

uniq!のような「!」は、「オブジェクトを破壊的に変更する」ものが多い。

5-3 ランダムなメソッド?sample、shuffle

ランダムというキーワードに当てはまるメソッド2選。

  • 「sample」:配列の中からランダムに1 要素取得する
  • 「shuffle」:ランダムに配列を並び替える

5-4要素の並び替え

順に並べるsortメソッド

  • 要素が数値:数字の小さい順
  • 要素が文字列:abc順("cba".sortは×)
  • 要素が文字列で大文字小文字:大文字→小文字順

逆順にするreverseメソッド

配列の要素を逆順にする。もしsort(小さい順)を逆(大きい順)にしたければこれらを組み合わせれば良い。

配列.sort.reverse

5-5 配列と文字列を組み合わせる

文字列を連結するjoinメソッド

配列の中の文字列を連結することができる。返ってくるのは「文字列」。

["A", "B", "C"].join
# ABC  

["A", "B", "C"].join("&")  
# A&B&C のように、joinの引数を間に入れ込んで連結する  

文字列を分割するsplitメソッド

文字列の中の文字ごとに分割する。返ってくるのは「配列」。

"A B C".split  
# ["A", "B", "C"]  

"A&B&C".split("&")  
# ["A", "B", "C"]

5-6各要素を変換する

各要素を変換して配列を作るmapメソッド

各要素を変換処理後、それらをもつ新しい配列を作成。
また要素を他の種類のオブジェクトへ変換することもできる。

numbers = [1,2,3].map do |変数名|
  変数名 * 3  
end
p numbers
# [3,6,9]が返ってくる  

numbers = [1,2,3].map {|変数名| 変数名 * 3}  
p numbers
# 上記を短くしたver  

またmapメソッドのような、要素に対してあるメソッドを呼び出すだけの場合、もっとシンプルに書くことができる。

numbers = ["123","234"].map(&:reverse)
p numbers

mapとeachについて

ブロックを渡して各要素に処理を行う似たような処理を行うが、目的が異なる。

  • 「each」:各要素にブロックで処理を行うことが目的
  • 「map」:各要素を変換して、新しい配列を作ることが目的

のことが多い。