Ruby:多行条件语法:如何实现?

16

我想要做什么:

result = (not question?) \
          and ( \
            condition \
            or ( \
              comparer == compared and another_question? \ 
            ) \
          )   

目标是拥有复杂和/或逻辑,同时保持可读性。

上述尝试的语法问题在于它以某种方式破坏了 Ruby 解析器中的括号,因此控制台会显示错误位于不在此代码中的文件中(虽然它在调用栈中)。

如果没有反斜杠,我会得到这些:

syntax error, unexpected kAND, expecting kEND (SyntaxError)

并且

 syntax error, unexpected kOR, expecting ')'

有没有关于如何正确实现这个的想法?


在示例中,another_question? \ 后面有一个空格。原始代码中是否存在该空格? - outis
非常正确。 "" 转义下一个字符。 - outis
4个回答

18

another_question? \中删除反斜杠后面的空格。你是在转义空格而不是换行符,这导致了语法错误。

注意:您不需要转义每个换行符。

result = (not question?) \
          and (
            condition \
            or (
              comparer == compared and another_question?
            )
          ) 

13

逻辑表达式中,应使用 &&||!,而不是 andornot

andornot 只应用于控制流程。

一个原因是 &&||! 的优先级高于 andornot

这篇博客文章中了解更多信息。


8

确保每行(除了最后一行)以运算符结尾,这样解释器就“知道”还有更多的操作数会到来,例如:

result = (not question?) and (
                condition or
                (comparer == compared and another_question?)
         )

(已通过MRI 1.8.7进行测试)


有没有办法让运算符在新的一行上? - NullVoxPopuli
2
@TheLindyHop:是的,用反斜杠掩盖换行符;-) 我不知道其他可能性。也许你可以重新修改代码,避免过于复杂的逻辑表达式? - undur_gongor

8

试试这个:

sub = (comparer == compared and another_question?)
result = (not question?) and (condition or sub)

不需要将整个内容变成一个表达式。

1
我倾向于将冗长的布尔表达式分解成方法,这些方法命名(并委托给)表达式的方面,并分配可读的名称来表达正在测试的内容。 - d11wtq
1
@d11wtq 单行方法也不易读!想象一下回到你的代码中,在一个if语句中看到数十个方法,并且必须追踪每个方法以找出它的作用。只有在多个位置使用时,才应提取方法。 - Chloe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接