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

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

ただいまの
回答率

88.23%

Ruby 論理演算and orと&&と||の違いについて

受付中

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 3,305

takuya_126

score 43

Ruby初心者です。
and or && ||のこれらの違いはなんなのでしょうか?
違いを教えていただけないでしょうか?
宜しくお願いします。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

0

大きく2つあります。
&& ||の方がand orよりも優先度が高いということ(代入演算子よりも演算子の優先度が低いこと)。
もうひとつ、両者の違いは、自己代入ができないこと、
などがあります。

例えば、サンプルです。

p 5 && 10 # p (5 && 10)と同じで、10が出力されます。

p 5 and 10 # p (5) and 10と同じで、5が出力されます。

前者は論理積の結果がpに渡されていますが、
後者ではpの実行結果と10の論理積が渡されているということです。

後者を&&と同じ結果にしようとするのであれば、
p (5 and 10)というようにすればできます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

優先度以外は同じです。
and or は、代入やメソッド呼び出しの引数の結合より、優先度が低いので、ringさんの例は、
p 5 and 10 は、(p(5)) and 10 と書くとよりわかりやすいかと思います。

また、p (5 and 10) は、pの直後の空白が肝で、空白の無いp(5 and 10) はエラーです。
前者の括弧は演算の優先度を示すための括弧、後者の括弧はメソッド呼び出しの引数をくくる括弧です。
後者の場合、引数を区切るカンマよりandの優先度が低いので、引数に出来ないため。
p((5 and 10)) はOK。外側の括弧がメソッド呼び出しの引数をくくる括弧、内側の括弧が演算の優先度を示す括弧です。

このあたり、and or not を使うと考慮点が多い、また、思わぬバグを生む可能性があると言うことで、コーディングルールで、and or not を禁止して && || ! だけを使うようにしている所もあるようです。
それはそれでありだと思います。

私は、and or not は構文の一部だというように、if/unless 等の条件部分の直下だけで使っています。(むしろ、条件部分の直下では && || ! は使わない)
代入や、メソッド呼び出しの引数では and or not は使わない。

あと、&& は || より優先度が高いが、and と or は同じ優先度というのも、and or を使うなら忘れてはいけません。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

and, or, &&, || の差については 他の回答に詳しいです。

この回答では コーディング規約の点からの情報を示します。

rubocop https://github.com/bbatsov/rubocop では 標準設定では and or の使用は警告が出ます。
$ cat sample.rb
a = true
b = false
puts '1' if a and b
puts '2' if a && b

$ rubocop sample.rb
Inspecting 1 file
C

Offenses:

sample.rb:3:15: C: Use && instead of and.
puts '1' if a and b
              ^^^

1 file inspected, 1 offense detected
and の代わりに && を使え  と警告がでています。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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