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

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

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

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

Q&A

解決済

1回答

1333閲覧

and / or の設定方法について

MeWhois

総合スコア8

Ruby

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

0グッド

0クリップ

投稿2015/01/31 23:27

"aaaは空文字でも0でもない"
かつ
"bbbも空文字でも0でもない"

を表そうとした場合、どのような式にすればよいでしょうか。

(aaa && bbb) != ("" || "0")
=> ともに空文字ならば偽
ともに0ならば真
ともに1ならば真
(aaa && bbb) == (!"" && !"0")
=> warning : string literal in condition

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

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

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

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

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

guest

回答1

0

ベストアンサー

素直に
"aaaは空文字でも0でもない"
かつ
"bbbも空文字でも0でもない"
を表現するなら、

lang

1 (aaa.is_a?(String) && !(aaa == '' || aaa == '0') && 2 bbb.is_a?(String) && !(bbb == '' || bbb == '0'))

ですね。

いくつかの 条件文の書き方と、その動作チェックをするものを書いてみました。

lang

1def check(aaa, bbb) 2 (aaa.is_a?(String) && !(aaa == '' || aaa == '0') && 3 bbb.is_a?(String) && !(bbb == '' || bbb == '0')) 4end 5 6def check2(aaa, bbb) 7 (aaa.is_a?(String) && aaa != '' && aaa != '0' && 8 bbb.is_a?(String) && bbb != '' && bbb != '0') 9end 10 11def check3(aaa, bbb) 12 (aaa && bbb) == (!'' && !'0') 13end 14 15def check4(aaa, bbb) 16 x = '' 17 y = '0' 18 (aaa && bbb) == (!x && !y) 19end 20 21TESTS = [ 22 {data: [nil, nil], ans: false}, 23 {data: [nil, '0'], ans: false}, 24 {data: [nil, '1'], ans: false}, 25 {data: [nil, ''], ans: false}, 26 {data: [nil, 0], ans: false}, 27 28 {data: ['0', nil], ans: false}, 29 {data: ['0', '0'], ans: false}, 30 {data: ['0', '1'], ans: false}, 31 {data: ['0', ''], ans: false}, 32 {data: ['0', 0], ans: false}, 33 34 {data: ['1', nil], ans: false}, 35 {data: ['1', '0'], ans: false}, 36 {data: ['1', '1'], ans: true }, # true 37 {data: ['1', ''], ans: false}, 38 {data: ['1', 0], ans: false}, 39 40 {data: ['', nil], ans: false}, 41 {data: ['', '0'], ans: false}, 42 {data: ['', '1'], ans: false}, 43 {data: ['', ''], ans: false}, 44 {data: ['', 0], ans: false}, 45 46 {data: [0, nil], ans: false}, 47 {data: [0, '0'], ans: false}, 48 {data: [0, '1'], ans: false}, 49 {data: [0, ''], ans: false}, 50 {data: [0, 0], ans: false}, 51].freeze 52 53TESTS.each do |test| 54 a = test[:data][0] 55 b = test[:data][1] 56 57 ans = check(a, b) 58 puts "#--- fail check: a=[#{a.inspect}], b=[#{b.inspect}] => #{ans}" if ans != test[:ans] 59 ans = check2(a, b) 60 puts "#--- fail check2: a=[#{a.inspect}], b=[#{b.inspect}] => #{ans}" if ans != test[:ans] 61 ans = check3(a, b) 62 puts "#--- fail check3: a=[#{a.inspect}], b=[#{b.inspect}] => #{ans}" if ans != test[:ans] 63 ans = check4(a, b) 64 puts "#--- fail check4: a=[#{a.inspect}], b=[#{b.inspect}] => #{ans}" if ans != test[:ans] 65 66end

実行すると、以下のようになります。

lang

1$ ruby cond.rb 2cond.rb:14: warning: string literal in condition 3cond.rb:14: warning: string literal in condition 4#--- fail check3: a=["1"], b=["1"] => false 5#--- fail check4: a=["1"], b=["1"] => false

質問文にあった (aaa && bbb) == (!"" && !"0") は、正しく true/false が返らないことがあります。(上のコードの check3 のメソッド)
warning の発生を無理やり解消したのが check4 です。でも true/false 判定が正しく動作していません。
check1, check2 の書き方におするか、別の書き方を上の様なコードでテストして動作チェックしてから利用するとよいと思います。

aaa, bbb が
”nil でない かつ String であること”
が保証されているなら、check1, check2 の書き方はもっと単純にできます。

投稿2015/02/01 02:28

katoy

総合スコア22324

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

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

MeWhois

2015/02/01 02:56

回答ありがとうございます。 シンプルに解決できると考えていたことが甘かったみたいです。 すこし前提をいじってみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問