条件||提高(“错误”)

时间:2012-04-04 17:24:18

标签: ruby

我只是想知道这个语法记录在哪里:

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 个答案:

答案 0 :(得分:7)

你所拥有的东西因为需要括号而无效:

1 > 2 || p("test")

请注意,or (and and) has a different precedence than &&/||因此可以在没有括号的情况下工作(并且您正在做的事情更具语义意义):

1 > 2 or p "test"

unless

p "test" unless 1 > 2

答案 1 :(得分:6)

这只是一种内联方式来说“如果条件为假则引发错误”。 ||只是一个常见的OR运算符,表达式使用short-circuit evaluation进行计算。然而,为了清楚起见,我更喜欢这个:

raise("error") unless 1 > 2

答案 2 :(得分: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"

答案 3 :(得分:0)

您在这里尝试完成的是控制流而不是条件逻辑。它是条件逻辑的无效语法。适当的控制流程将使用“和”和“或”结构。这就是他们的目的而不是,并且通常错误地假设,并且&amp;&amp; amp;和||条件运算符。它们是不同的,具有不同的评估优先顺序,应该在正确的位置使用。例子:

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'   

基本上,如果你试图从声明中读出真或假,请使用&amp;&amp;和||。如果您尝试基于条件评估执行代码路径,请使用and和or。