【ゼロからわかるRuby超入門2】Ruby 条件分岐、配列
【目次】
- 3-1 条件判断
- 3-2条件を満たした時の処理
- 3-3条件を満たさないときにも処理する
- 3-4複数の条件を組み合わせる
- 3-5複数の中から1つ選択
- 3-6繰り返し
- 4-1オブジェクトをまとめて扱う
- 4-2要素の取得
- 4-3配列に要素を追加・削除
- 4-4配列の繰り返し
- 5-1配列の便利なメソッド
- 5-2メソッドの機能
- 5-3 ランダムなメソッド?sample、shuffle
- 5-4要素の並び替え
- 5-5 配列と文字列を組み合わせる
- 5-6各要素を変換する
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」:各要素を変換して、新しい配列を作ることが目的
のことが多い。