質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

4回答

146閲覧

繰り返し処理 include?を使った条件分岐が上手く書けない

ko-u

総合スコア61

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2019/01/11 07:42

編集2019/01/11 07:47

初めまして、Ruby初学者です。

現在、入力した値にキーワードが含まれているか、いないか表示させるシステムの実装をしております。

input_lines = gets.to_i retreve_word = gets.chomp input_lines.times do word = gets if word.include?(retreve_word) puts word end end

reterve_wordがキーワードを表しています。

input_linesの回数だけinclude?メソッドを動かすのですが、全てのwordに一致していなかった場合には
Noneを返すような実装をしたいのですが、上手くできません。

elseを使用することはわかっているのですが、どのように条件を書けばよろしいでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

全行をメモリーに保持してよいなら、こんな書き方もできます。

ruby

1def task(lines, retreve_word) 2 lines.select{|line| line.include?(retreve_word)} 3 .map{|line| puts line} 4 .size > 0 5end 6 7retreve_word = '123' 8 9lines = ["abc def", "123", "456"] 10pp task(lines, retreve_word) 11puts 12 13lines = ["abc", "def", "456"] 14pp task(lines, retreve_word) 15puts 16 17# lines = (1..3).map{|x| gets.chomp} 18# retreve_word = gets.chomp 19# pp task(lines, retreve_word)

lines に全行を保持します。
lines で retreve_word を含む行だけを残します。
残った行を puts します。
puts した個数が 0 より大きかったかを true/false で返します。

投稿2019/01/11 18:33

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ko-u

2019/01/12 11:02

こんな書き方もあるのですね! とても勉強になりました! ありがとうござます!
guest

0

ruby

1input_lines = gets.to_i 2retreve_word = gets.chomp 3if(input_lines.times.count{ 4 word = gets 5 next !puts(word) if word.include?(retreve_word) 6 }.zero?) 7 puts "一致するwordは存在しませんでした。" 8end

ところで、include?による判定よりもeql?の方が一致する単語ぽい感じがします。

投稿2019/01/12 03:19

編集2019/01/12 03:21
asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ko-u

2019/01/12 11:00

確かにeql?の方がニュアンスとして単語に近いですね! ご教授ありがとうございます!
guest

0

ベストアンサー

全てのwordに一致していなかった場合

という表現が少し曖昧ですが、どのwordにも一致しなかった場合という意味と取ります。

元のプログラムに追加する形で考えるなら、普通はフラグを使います。

Ruby

1input_lines = gets.to_i 2retreve_word = gets.chomp 3no_match = true 4input_lines.times do 5 word = gets 6 if word.include?(retreve_word) 7 puts word 8 no_match = false 9 end 10end 11if no_match 12 どのwordにも一致しなかった場合の処理 13end

elseを使用することはわかっているのですが、

質問者さんの想定はこんなイメージでしょうか?

Ruby

1input_lines = gets.to_i 2retreve_word = gets.chomp 3no_match_count = 0 4input_lines.times do 5 word = gets 6 if word.include?(retreve_word) 7 puts word 8 else 9 no_match_count += 1 10 end 11end 12if no_match_count == input_lines 13 どのwordにも一致しなかった場合の処理 14end

投稿2019/01/11 07:57

otn

総合スコア84529

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ko-u

2019/01/11 08:05

フラグというものを使用したことがありませんでした! とても勉強になりました!詳しい解説もありがとうございました!
otn

2019/01/12 04:51

本筋と関係ないですが、retreve は retrieve のスペルミスでしょうね。
guest

0

デフォルトでfalseにしておき、条件にあったときにtrueとなるフラグ変数を使うとかですかね。
あるいは丸々関数にすればフラグを使わずともループ内returnでいけますね。

投稿2019/01/11 07:53

dice142

総合スコア5158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ko-u

2019/01/11 08:05

ご回答ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問