記憶の外付けHDD

切実に頭にUSBのコネクターがほしいです。なるべくtype-cでお願いしたいです。(忘れないように、プログラミング学習で学んだことを投稿してます)

2019/09/15_rubyの配列とeach(忍者の存在を知られないようにする)

まえがき

  • 今日も、rubyアルゴリズム問題を解いたので、新しく私の一部となった知識を記録します。
  • 内容は、配列関係です。

    例題

    以下の配列から、eachを使って全員をputsしなさい。
    ただし、忍者は除くものとする。 (存在を知られちゃいけないので)

edo_people = ["","百姓","宣教師","忍者"]

each処理をスキップする

忍者をputsしちゃいけないってことは…
→ 忍者をeachしないようにするってことなんで、
eachメソッドの対象から外す方法を調べました。

方法1

  • まず、要素の最後以外を対象にeachするという発想です。
  • array[番号].each do ~という方法を使います。
edo_people = ["","百姓","宣教師","忍者"]

edo_people[0..2].each do | human |
  puts human
end
  • 解説

    • eachメソッドの対象である配列の中身を[0..2]という記載で、「侍(要素番号0)」から「宣教師(要素番号2)」だけに限定します。
  • 問題点
    この方法だと

    • そもそも忍者の位置がわかんない。
    • 黒船が来航したので、配列に「ペリー」を追加したい。

    といった場合、対応できないです。

方法2

  • 次の方法は、値が忍者だったとき、スキップするという発想です。
  • ifnextを使用します。
edo_people = ["","百姓","宣教師","忍者"]

edo_people.each do | human |
  next if human == "忍者"
  puts human
end
  • 解説
    • ifnextを使って、「もし変数humanの値が忍者だったら、putsを飛ばす」という処理を追加しました。
    • ちなみに、↑のコードでは、「後置のif」というやつで記載してます。普通の条件分岐の書き方でもOKです。

これで、「あれ?なんとなく屋根裏に忍者がいる気がする…」といった場合でも、安心して「越後屋、お主悪よのぉ〜」的な密談ができますね。

参考