为什么Ruby表达式使用return语句和双“&”符号会导致语法错误

4
def foo
  true && return false
end

def bar
  true and return false
end

foo方法会导致语法错误,而bar不会,为什么?

假设我想评估带有返回语句的单行表达式(类似于某些常用的shell/bash表达式),这是否是一种推荐的方法,还是有更好的方法?


我怀疑解释器会评估表达式:((true && return) false) - Dennis
2
以下两个答案都说这是由于优先级或结合强度(&& > and)导致的,但有没有人能解释为什么return位于它们之间?为什么return不管怎样始终取其后面的参数/值? - Reinstate Monica -- notmaynard
@iamnotmaynard 如果我的回答是你提到的两个之一,那么你可能误解了我的意思。(同时这也适用于Simone Carletti的回答。)我并不是说&&and优先级高。我(通过示例隐含地)表达的是,&&return方法调用(带参数)的优先级高。 - sawa
4个回答

6

根据操作符结合性的强度,

true && return false

评估为

(true && return) false

其中
true && return

这个语句是合法的,但它后面的false是无效的。你不能在两个语句之间什么都不加地排列它们。


此外,and 的优先级低于 &&,正如@sawa所指出的那样,这就是为什么 foo 不起作用而 bar 起作用的原因,因为 bar 的计算结果符合您的预期。 - Donovan

4

旁注

值得注意的是,and&&不等价。

and是一个流程控制运算符,而&&是一个布尔运算符。有什么区别呢?

一个区别的例子,使用and,你可以赋值。

value = nil and value / 42

这个操作如果按照以下方式尝试会失败。
value = nil && value / 42

问题1

假设我想评估一个带有返回语句的一行代码(类似于某些常用的shell / bash表达式),这是否是建议的方法,还是有更好的方法?

在 Ruby 中,我始终看到的方法是:

value if conditional

如果条件成立,这将返回值,否则返回nil。如果这是函数中的最后一条命令,则不需要return语句!

如果您要在函数中提前退出,我建议使用unless。例如...

return unless arguments_are_valid

原始问题2

foo方法会导致语法错误,而bar不会。为什么?

这是运算符优先级的问题。请看下面的示例,展示它们如何被评估。

(true && return) false
(true) and (return false)

最佳答案是因为它回答了问题并给出了例子/用例。谢谢! - Dennis

3
由于 && 运算符的优先级,以下行代码:
true && return false

评估为

(true && return) false

这没有意义。为了执行您的代码,您需要使用

def foo
  true && (return false)
end

and没有遇到相同的问题,因为and&&优先级低。


0
如果需要缩短语句,请使用


def foo
  return false if true
end

def bar
  return false if true
end

return不是一个函数 :) 因此说它没有意义

when true and return is ok send a false

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