4

この構文がどこに文書化されているのか疑問に思っています。

1 > 2 || raise("error")

私はそれを条件として使用しようとしました:

1 > 2 || p "test"

しかし、それは機能しません:

SyntaxError: (irb):9: syntax error, unexpected tSTRING_BEG, expecting keyword_do or '{' or '('
1 > 2 || p "test"
            ^
        from C:/Ruby193/bin/irb:12:in `<main>'
4

4 に答える 4

7

括弧が必要なため、持っているものは機能しません。

1 > 2 || p("test")

or(および)の優先順位は/とandは異なる&&||ため、括弧なしで機能することに注意してください(そして、実行していることを使用すると、より意味的に意味があります)。

1 > 2 or p "test"

のようにunless

p "test" unless 1 > 2
于 2012-04-04T17:32:20.453 に答える
7

これは、「条件がfalseの場合にエラーを発生させる」というインラインの方法にすぎません。|| は単なる一般的なOR演算子であり、式は短絡評価を使用して評価されます。それにもかかわらず、明確にするために、私はこれを好むでしょう:

raise("error") unless 1 > 2
于 2012-04-04T17:26:31.403 に答える
4

どちらの実行も機能します。問題は、の括弧が除外されていることpです。IRBからコードを実行する:

ruby-1.8.7-p302 :003 > 1 > 2 || raise("error")
RuntimeError: error
    from (irb):3

"test" を追加すると、呼び出しは期待どおりに機能します。

ruby-1.8.7-p302 :004 > 1 > 2 || p("test")
"test"
于 2012-04-04T17:33:04.680 に答える
2

ここで達成しようとしているのは、条件付きロジックではなく制御フローです。条件付きロジックの構文は無効です。適切な制御フローでは、「and」および「or」構造が使用されます。これが目的であり、多くの場合誤って想定されているように、&&および||の構文糖衣置換ではありません。条件演算子。それらは異なり、評価の優先順位も異なるため、適切な場所で使用する必要があります。例:

1 > 2 or p 'no it is not'
2 > 1 and return
instance.exists? or not_found!
instance && instance.success? or raise FailureException, 'missing or unsuccessful'   

基本的に、ステートメントからtrueまたはfalseを読み取ろうとしている場合は、&&および||を使用します。条件付き評価に基づいてコードパスを実行しようとしている場合は、andおよびorを使用します。

于 2013-07-12T00:31:37.540 に答える