【Ruby】each_with_indexとsearchを組み合わせたプログラム・考え方


アウトプット用に記します。
macOS Catalina10.15.6にインストールしたRuby 2.6.5を使用。

やりたいこと

数を探して何番目に含まれているか結果を返すメソッドをsearcheach_with_indexを用いて作成したいんよね。

まずこういう配列があるたいな

input = [3, 5, 9 ,12, 15, 21, 29, 35, 42, 51, 62, 78, 81, 87, 92, 93]

んで、こんな感じに使えるsearchにしたいわけたいな


search(12, input)
=> 4番目にあります

search(7, input)
=> その数は含まれていません

each_with_indexについて

each_with_indexはRubyに標準で組み込まれているメソッドの1つたいね。要素の繰り返し処理と同時に、その要素が何番目に処理されたのかも表せるんよ。


#each_with_indexの使い方

配列名.each_with_index  do |item, i|

end

さらに詳しいeach_with_indexの使用例


cigarettes = ["MEVIUS", "highlight", "LuckyStrike"]

cigarettes.each_with_index do |item, i|
 puts "#{i}番目のタバコは、#{item}です。"
end

これ↑を実行すると、以下のような出力結果が得られるとよ。

0番目のタバコは、MEVIUSです。
1番目のタバコは、highlightです。
2番目のタバコは、LuckyStrikeです。

さあ本題、どうやる?

  1. なにはともあれsearchメソッドを自分で定義せいっちゅうことやね。
  2. 仮引数を2つ用意するノリやね。(tage_i,input)と、しとこうか。
  3. 配列inputeach_with_indexの使い方に当てはめて・・・。ブロック変数にも2つ引数を渡しす(なんとなく | i, index |にした)。
  4. 含まれてたら〜と、含まれてなかったら〜があるから、条件分岐if使うっしょ・・・?もしiと入力してtarget_numと等しければreturn前のputsを出力する。returnしとかんと、要素の数だけ繰り返しちゃうかんね!
  5. 配列並べて、ためしに一個呼び出してみる
array.rb

def search(tage_i, input)
  input.each_with_index do |i, index|
    if i == tage_i
      puts"#{index + 1}番目にあります!"
      return
    end
  end
  puts "その数は含まれていません"
end

input = [3, 5, 9 ,12, 15, 21, 29, 35, 42, 51, 62, 78, 81, 87, 92, 93]
search(11, input)

結果

ちなみに当てはまってる数字も出力させてみる・・・

array.rb

def search(tage_i, input)
  input.each_with_index do |i, index|
    if i == tage_i
      puts"#{index + 1}番目にあります!"
      return
    end
  end
  puts "その数は含まれていません"
end

input = [3, 5, 9 ,12, 15, 21, 29, 35, 42, 51, 62, 78, 81, 87, 92, 93]
search(11, input)
search(29, input) #「〜番目にあります!」の条件にあてはまる数字の追加

なにをともあれ

ゆっくりじっくり考えればいける・・・?
まだ表面だけしか理解できてない感否めないから、いったんメモる。またアップデートすると思う。