初めに
初学者です。rubyの練習問題を私なりに解説することによって定着するのが目的です。間違いありましたらご指摘お願いします。
問題
以下の配列から数を探して何番目に含まれているか結果を返すsearchメソッドをeach_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に標準で組み込まれているメソッド。要素の繰り返しと処理と同時にその要素が何番目に処理されたのかも表すことができます。
eachメソッドと似てますよね。書き方もeachメソッドとほとんど同じです。
例
配列名.each_with_index do|item,i|
end
each文と違うところはブロック変数の中に変数が2つ定義されている点です。この場合、itemが配列の中身、iがその配列の何番目に処理されたかが入ります。
####問題の解説
ではまずsearchメソッドの呼び出す際の処理から入っていきます。まずは配列inputを定義します。次にsearchメソッドを呼び出す際に2つの変数を定義して実引数としてセットします。
input = [3, 5, 9 ,12, 15, 21, 29, 35, 42, 51, 62, 78, 81, 87, 92, 93]
search(12, input)
では、引数をsearchメソッドに引き渡し、each_with_indexで配列の中身と順番を受け取る変数をブロック変数の中に定義します。
def search(target_num, input)
input.each_with_index do |num, index|
end
input = [3, 5, 9 ,12, 15, 21, 29, 35, 42, 51, 62, 78, 81, 87, 92, 93]
search(12, input)
ここで一旦整理します。現状searchしたい整数は12です。そして12が配列の何番目にあるのか,もしくはないのかをsearchメソッドを使用して検証します。
では12であるかどうかを検証するには、if文を使い12の時だけ処理をするような記述を書けばいいのです。
配列の中身は変数numに順番に呼び出されます。そして変数target_numの中身は12です。
よって、if num == target_numと記述することによって12の時に処理をすることができます。さらにindexには繰り返された数が入っています。よってindexを出力する記述を書けばいいのです。
def search(target_num, input)
input.each_with_index do |num, index|
if num == target_num
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(12, input)
上記の記述で4番目にあります。と結果がでます。
注意としてindexに+1をしています。これは配列は0から数えられるためです。
また,returnを忘れると要素の数だけ処理を行っていますのでそこも注意が必要です。