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

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

ただいまの
回答率

90.32%

  • Ruby

    8210questions

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

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

解決済

回答 4

投稿

  • 評価
  • クリップ 1
  • VIEW 1,104

yuki_90453

score 96

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+7

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

$ irb
irb(main):001:0> arry = ["apple","pineapple","orange"]
=> ["apple", "pineapple", "orange"]

irb(main):002:0> p 'no exist apple' if arry.select{ |a| a == 'apple' }.empty?
=> nil

irb(main):003:0> p 'no exist banana' if arry.select{ |a| a == 'banana' }.empty?
"no exist banana"
=> "no exist banana"

参考情報

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/09 21:57

    ネストが増えるのでなしで。

    キャンセル

  • 2017/02/09 22:05

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

    キャンセル

  • 2017/02/09 22:19

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

    キャンセル

  • 2017/02/09 22:25 編集

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

    キャンセル

  • 2017/02/10 18:54

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

    キャンセル

  • 2017/02/10 19:16 編集

    俺の頭の中ですっかり忘れてる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")
    みたいになります。

    キャンセル

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.32%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Ruby

    8210questions

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