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

这只是一种内联方式来表示“如果条件为假则引发错误”。|| 只是一个普通OR运算符,表达式是使用短路评估来评估的。不过,为了清楚起见,我更喜欢这个:

raise("error") unless 1 > 2
于 2012-04-04T17:26:31.403 回答
7

你所拥有的不起作用,因为你需要括号:

1 > 2 || p("test")

请注意,or(and and) 的优先级与&&/||不同,因此可以在没有括号的情况下工作(并且您正在做的事情更具语义意义):

1 > 2 or p "test"

一样unless

p "test" unless 1 > 2
于 2012-04-04T17:32:20.453 回答
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'   

本质上,如果您试图从语句中读取真假,请使用 && 和 ||。如果您尝试基于条件评估执行代码路径,请使用 and and or。

于 2013-07-12T00:31:37.540 回答