"aaaは空文字でも0でもない"
かつ
"bbbも空文字でも0でもない"
を表そうとした場合、どのような式にすればよいでしょうか。
(aaa && bbb) != ("" || "0")
=> ともに空文字ならば偽
ともに0ならば真
ともに1ならば真
(aaa && bbb) == (!"" && !"0")
=> warning : string literal in condition
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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
総合スコア22324
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/02/01 02:56