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

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

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

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

Q&A

解決済

4回答

9869閲覧

eachとifの組み合わせで、if文が全てfalseだったのみ動く書き方

yuki_90453

総合スコア326

Ruby

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

0グッド

1クリップ

投稿2017/02/09 09:34

いつもお世話になっております。
下記のコードのようにeachとifを組み合わせて書いた場合、内包されているifが全てfalseのみ動くコードを書きたいと考えております。

arry = ["apple","pineapple","orange"] arry.each {|fruit| if fruit == "apple" #true else p "false" end }

私のやり方では、eachで繰り返した数だけ、false時に実行されたいプログラムが動いてしまいます。
ご指摘お願い致します。

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

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

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

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

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

guest

回答4

0

ベストアンサー

こういう場合は、.none?というメソッドがあります。

ruby

1arry = ["apple","pineapple","orange"] 2if arry.none?{ |a| a == "apple" } 3 # 全部falseの場合の処理 4end

投稿2017/02/09 12:05

編集2017/02/09 12:06
maisumakun

総合スコア145183

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

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

0

ruby

1$ irb 2irb(main):001:0> arry = ["apple","pineapple","orange"] 3=> ["apple", "pineapple", "orange"] 4 5irb(main):002:0> p 'no exist apple' if arry.select{ |a| a == 'apple' }.empty? 6=> nil 7 8irb(main):003:0> p 'no exist banana' if arry.select{ |a| a == 'banana' }.empty? 9"no exist banana" 10=> "no exist banana"

参考情報

...
all?, none?, any?, one?, grep, detect, select, ...
...

投稿2017/02/09 14:40

katoy

総合スコア22324

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

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

0

Ruby

1arry = ["apple","pineapple","orange"] 2count = 0 3arry.each {|fruit| 4 if fruit == "apple" 5 #true 6 else 7 if count == 0 8 p "false" 9 count = 1 10 end 11 end 12}

Ruby

1arry = ["apple","pineapple","orange"] 2count = 0 3arry.each {|fruit| 4 unless fruit == "apple" 5 if count == 0 6 p "false" 7 count = 1 8 end 9 end 10}

質問を、「1度だけ"false"を表示するようにしたい」ということだと
理解してそうなるような方法を考えてみました。

投稿2017/02/09 10:38

編集2017/02/09 11:01
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

yuki_90453

2017/02/09 12:57

ネストが増えるのでなしで。
退会済みユーザー

退会済みユーザー

2017/02/09 13:05

ご注文ありがとうございます。 でしたらこういうのはいかがでしょうか? arry = ["apple","pineapple","orange"] count = 0 arry.each {|fruit| unless fruit == "apple" count = 1 end } if count == 1 then p "false" end
yuki_90453

2017/02/09 13:19

注文したつもりは。。。(笑) これがよいと思います arry = ["apple","pineapple","orange"] if arry.none?{ |a| a == "apple" } # 全部falseの場合の処理 end
退会済みユーザー

退会済みユーザー

2017/02/09 13:33 編集

ベストアンサーが決まる前にコメントを書いていただけなのでお気になさらず。 私もその方法がベストだと思います。 配列にappleがない場合に処理をするならinclude?でもよいのではと 今、調べているところであります。 追記 include?だと複数条件にできないらしいということが分かりました。
yuki_90453

2017/02/10 09:54

>include?だと複数条件にできないらしいということが分かりました。 下記のような条件式も駄目なんでしょうか? val["RAC"].include?(k) || k == val["番号"]
退会済みユーザー

退会済みユーザー

2017/02/10 10:37 編集

俺の頭の中ですっかり忘れてるrubyの配列ごにょごにょ http://qiita.com/dharry/items/8c7300c62c686ad2def6 こちらのQiitaの記事を参考にしました。 「複数条件にできない」というのは以下のような意味でした。 arr1という配列に「a」があるかどうかを調べる。 arr1 = ["a", "b", "c"] p arr1.include?("a") arr1に「a」「b」以外があるか調べる arr1 = ["a", "b", "c"] arr2 = ["a", "b"] p (arr1 - arr2).none? appleがあるかどうかだけならinclude?でもよいのですが この方法だと例えば"pineapple"があるかどうかも同時に 調べることができません。include?を使うと恐らく入れ子になると思います。 質問の内容を考えてみると、条件が複数ある可能性もあるので その可能性も視野に入れたmaisumakun様の方法がやはりベストです。 修正 「include?を使うと恐らく入れ子になると思います。」 入れ子ではなくunless arry.include?("apple") && arry.include?("pineapple") みたいになります。
guest

0

こういうときにはフラグを使うのが簡単です。

変数を一つ用意し、それを false で初期化します。
ループ中で条件が true になった時だけフラグを true にします。
すると、ループが終了した時点で、条件が全て false であった時のみフラグは false となり、一回でも true になったらフラグは true になります。

処理はループが終わった後でこのフラグを見て行って下さい。

投稿2017/02/09 12:08

Zuishin

総合スコア28660

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問