Rubyの構文(&&を用いた条件分岐について)

このQ&Aのポイント
  • ruby初心者です。最近、ruby on railsで書かれたソースを引き継ぎ解析を行っています。上記プログラムを実行すると、if ~ end までが実行されませんでした。変数boolをtrueに変更して再実行したところ、if文が実行されました。私は、上記プログラムはif num == 0 && boolの条件がtrueの場合、if文が実行されると解釈しました。
  • 上記プログラムがどのような動作をするのかについて、正しい解釈はif num == 0 && boolの条件がtrueの場合、if文が実行されるというものです。実際にプログラムを実行して確認することもできます。&&は論理演算子であり、複数の条件を結合するために使用されます。
  • 参考URL:https://techacademy.jp/magazine/19856
回答を見る
  • ベストアンサー

rubyの構文(&&を用いた条件分岐について)

ruby初心者です。 最近、ruby on railsで書かれたソースを引き継ぎ解析を行っています。 その中で、以下のような構文が出てきました。 ========================================= num = 0 bool = false vals = '' puts 'start' num == 0 && bool && if vals  puts 'true' else  puts 'false' end puts 'end' ========================================= 上記プログラムを実行すると、if ~ end までが実行されませんでした。 そこで、変数boolをtrueに変更して再実行したところ、if文が実行されました。 そこで私は、上記プログラムは以下と同値であると解釈しました。 ====================================== (省略) if num == 0 && bool  if vals   puts 'true'  else   puts 'false'  end end ======================================= 以上を踏まえて・・・ 1.私の解釈は正しいでしょうか? 2.間違っている場合、正しい処理の解釈を教えていただけますでしょうか?または参考URLを教えていただけますと助かります。 文の最後に"&&"がついている文を見たことがなく、ネットで調べても 正解らしいものが掲載されていなかったので質問させていただきました。 拙い説明で申し訳ありませんが、よろしくお願いいたします。

  • Ruby
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • Werner
  • ベストアンサー率53% (395/735)
回答No.1

演算子式 - Rubyリファレンスマニュアル http://www.ruby-lang.org/ja/man/html/_B1E9BBBBBBD2BCB0.html#and && はショートサーキット論理演算子の一種なので、  式A && 式B としたときは、 まず左辺の式Aが評価され、 その結果が真であった場合のみ右辺の式Bも評価されます。 もし、式Aが偽であれば式Bは評価(実行)されません。 そのため、式Aが真の時にのみ式Bを実行したいときに 上記の様な書き方をすることが可能です。 また、rubyにおいてifは式なので式Bはif式でも大丈夫です。 (C言語などとは違ってrubyのifは「値を持つ式」だったりします。) # 合ってるか間違ってるかはあえて明言しませんでしたがこの説明でそれは判断できますよね? なお、ショートサーキットはPerlで割と良く出てきます。

k-s1h9u8n3
質問者

お礼

Werner様 早速の回答ありがとうございました。 C言語とPHPしか主に触っていなかったので、まず文法に面食らってしまっていました。。。 ifも式と考えれば自然な書き方ですね(慣れるまで大変そうですが…) 明解な回答に感謝いたします。

関連するQ&A

  • Ruby バブルソート

    バブルソートのプログラムでわからないところがあるため、 質問させていただきます。 Rubyは1.9.3を使用しています。 <プログラム> --------------------------------------------------- def bsort(data)   while true     # swapped変数は数値の入れ替えを記憶     swapped = false     for i in 0..data.size-2       if data[i] > data[i+1]         temp = data[i]         data[i] = data[i+1]         data[i+1] = temp         swapped = true       end     end     return if !swapped   end end data = [10, 9, 8, 7, 6] bsort(data) puts "ソート結果#{data}" --------------------------------------------------- return if !swapped のところで、 なぜwhileのループから抜けられるのかがよくわかりません。 return if swapped == false と書き換えて実行しても同じ結果が得られたのですが、 数値の入れ替えがなければ swapped = false であるため、 !swappedはtrueとはならないのでしょうか。

  • rubyのunlessで遊んでいたら

    Rubyのunlessで適当にプログラムをつくって遊んでいました。 01:a = 10 #aに10を代入 02:b = 20 #bに20を代入 03: 04:unless a > b 05: puts "aはbより大きくない" 06:else 07: puts "aはbより小さくない" 08:end 09:#unless文にはelsif節等がなく、条件項目を増やせないのでaとbの値が同じ場合は 10:#どうしようかと、これをif文で補おうとしました。 11:if a = b 12: puts "aとbは同じです" 13:end 14: 15:puts "a=#{a} b=#{b}" そもそも、aとbの値が同じでない場合11行目のifが実行されることは無いだろうと思っていたのですが実効結果は ↓ aはbより大きくない aはbと同じ a=20 b=20 という結果がでました。実行結果一行目の「aはbより大きくない」と出力されたのはプログラム4行目のunless文の返した結果だろうと理解できましたが、実行結果2行目のif文の結果である「aはbとおなじ」が出力されたのか、実行結果3行目でaとbの変数内を参照しておりますが、ここでどうしてaの値が20に変更されているのか、わかりません。 詳しい方いらっしゃいましたらご教授願います。

    • ベストアンサー
    • Ruby
  • VBAで分岐条件に名前をつける

    If文の条件を外にだしさらに下記のようにIf文の中で論理演算を させるようなプログラムを作りたいにのですが、 ExxelVBAでそのようなことはできますでしょうか? できるとしたら教えてください。よろしくお願いします。 sub test() S1=36 S2=48 ’こういう名前の付け方はできないが、要はS1>0という条件に条件1と名づけたい。 条件1:=S1>0 条件2:=S2>0 IF 条件1*条件2=true then cells(1,1)=1 else if 条件1=true then cells(1,1)=2 else if 条件2=true then cells(1,1)=3 else cells(1,1)=0 end if end sub

  • 【ruby】【文法?】ブロックをbreakした時。。

    質問を見ていただいて有難うございます。 質問を一言で言うと、 「メソッドの中で呼び出し元がbreakを使った事を検知できるか?」 となるのでしょうか。。。以下に詳しく質問を記述いたします。 引数に配列を渡すと、その配列をブロックに一つずつ返してくれる メソッドhoge()があるとします。 以下の様に使います。 ------------------------------------- hoge([0,1,2]) do |x|  puts x end 実行結果 0 1 2 ------------------------------------- このhoge()は、実行中にエラーが発生した場合、トラップして falseを返す事とします。(何事もなければtrueを返します。) このhoge()を以下の様に書きました。 def hoge(arg)  begin   arg.each do |x|    yield x   end  rescue   false  else   true  end end 以下の様に使います。 ------------------------------------- ret=hoge([0,1,2]) do |x|  puts x end puts ret ? 'success' : 'fail' 実行結果 0 1 2 success ------------------------------------- ------------------------------------- ret=hoge(nil) do |x|  puts x end puts ret ? 'success' : 'fail' 実行結果 fail ------------------------------------- ここまでは、よかったのですが、hoge()のブロックの中で、breakを使うと hoge()の戻り値はnilになってしまいます。 ------------------------------------- ret=hoge([0,1,2]) do |x|  break if x==1  puts x end puts ret puts ret ? 'success' : 'fail' 実行結果 0 nil fail ------------------------------------- ここで質問です。 最後の例は、hoge()として異常系ではないので、retにtrueを与えたいのですが、どうしたらよいでしょうか? ご指導のほど、宜しくお願いいたします。

    • ベストアンサー
    • Ruby
  • ruby forkについて教えて下さい

    親プロで用意した配列の中の要素を一つづつ子プロでputsした後、最後一回、親プロで生成した子プロのPIDを確認したいです。 こんなふうに書いてみました。 #!/usr/bin/ruby table=%w(a b c d) array=[] while i=table.pop do if pid=fork then array.push pid puts pid break if table.size > 0 p array else puts i end end 実行すると、以下のような結果になりました。 $9200 c 9201 b 9202 [9202] a $ PIDが一つしか得られてません。 どうしたらよいでしょうか? ご教授の程、宜しくお願いいたします。 rubyは 1.8.7 を使ってます。 以上、宜しくお願いいたします。

    • ベストアンサー
    • Ruby
  • javaのプログラムについての質問です。

    javaのプログラムについての質問です。 javaについて、あまり詳しくないので質問させていただきます。 ボタンを押して円などの色を変えるプログラムで、2色を変える(黄→赤)if文は public void actionPerformed(ActionEvent e) { if (bool) { setBackground(Color.yellow); this.bool = false; } else { setBackground(Color.red); this.bool = true; の様にfalseとtrueを使えばできるのですが、もし3、4色の場合はif文の中をどうしたら良いですか? できれば、ボタンを押すたびに黄→赤→黒→黄…など3~4色のループするようにしたいです。 いろいろ考えたのですが、うまくいきません。どなたか教えて下さい。

    • ベストアンサー
    • Java
  • Rubyの初心者ですが壁にぶちあたっております

    『初めてのプログラミング』を読んでRubyを勉強しています。その中にある問題でp.127の『ローマ数字をアラビア数字に変換するプログラム』を書け、というのがありまして、最初に入力したローマ数字を弾く部分を書いているのですが…(以下コード) puts 'Enter roman numeral.' roman = gets.chomp.upcase roman_array = roman.to_a def char_checker(char) parts = ['I', 'V', 'X', 'L', 'C', 'D', 'M'] parts.each do |part| if part != char char = false elsif part == char char = true return char end end puts char_checker('X') (以上コード) このchar_checker, なぜかpartsを返してきます。返してほしいのはcharのtrueかfalseなのに泣 書いたコードに間違いがあるのはわかっているのですが、どこで間違っているのかがどうしてもわかりません。わかる方回答よろしくお願いします。ちなみに環境はMac OS X 10.5.4でrubyのバージョンはバンドルされている1.8.6です。

  • Rubyでの条件分岐について

    登録フォームについての質問です。 ログイン用フォームのhome.cgi と、それにリンクするユーザー登録用フォームのregistration.cgi があり、今回質問するのはユーザー登録用のregistration.cgiの方です。そしてユーザーIDとPasswordはdata.txtに書き込んでいます。書き込み自体は成功するのですが、それ以外のところで問題がでている状態です。条件分岐がうまくいきません。 下記のように書いた時におこる問題点等について教えていただきたいと思います。 (1)IDとPassword のinput に値が空の時に、ボタンを押しても、登録完了しました と表示されてしまうので、この様な場合は、"もういちど確認してください" などの警告文を出したいです。 (2)IDとPassword の文字数に制限を入れたいのですが、分かりませんでした。 双方とも4文字以上8文字以下にしたいです。それ以外の場合は、条件分岐で、"文字数を確認してください"などの警告文を出したいです。 -------- < ここから registration.cgi >-------------------- #!/usr/bin/ruby require "cgi" cgi = CGI.new puts <<HTML Content-Type: text/html <html> <head> <title>練習問題</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> <h1>練習(1)</h1> 登録フォーム <form action="registration.cgi" method="post"> ユーザーID:<input type="text" name="login" ><br> パスワード:<input type="text" name="password"><br> <input type="submit" value="submit"> </form> HTML if cgi.params["login"][0] then f = open("data.txt","a") f.puts"%s:%s" %[cgi.params["login"][0],cgi.params["password"][0]] f.close puts "登録完了しました" else end puts <<HTML <br> <a href="./home.cgi">戻る</a> HTML -------- < ここまで >--------------------

    • ベストアンサー
    • Ruby
  • 条件分岐でelseは使うべきですか?

    言語は問わず1と2のようなやり方があるのですが、どちらがいいとかあるのでしょうか? 1の方が記述量が少ないけど、2の方が可読性が高い。 ケースバイケースなのかもしれませんが、それぞれのメリットデメリットご教示いただけますでしょうか? よろしくお願いいたします。 1 $flag = false; if ($action == 'edit') { $flag = true; } 2 if ($action == 'edit') { $flag = true; } else { $falg = false; }

    • ベストアンサー
    • PHP
  • こういうプログラムって?

    iseven(num) Func If remain(num,2)=0 Then Return Else  Return Flase End If EndFunc 以上のようなNが2で割れるときのみTrueと表示するプログラム なんですけど このプログラムにおいて(num,2)=0って どういう意味なんでしょうか? numが自然数ってのがネットで調べてわかっただけですm(__)m それとIF THENを利用して 偶数のみの和や積を求めるプログラムの 文がわからないのでどなたか教えてください。

専門家に質問してみよう