def foo
true && return false
end
def bar
true and return false
end
foo
方法会导致语法错误,而bar
不会,为什么?
假设我想评估带有返回语句的单行表达式(类似于某些常用的shell/bash表达式),这是否是一种推荐的方法,还是有更好的方法?
def foo
true && return false
end
def bar
true and return false
end
foo
方法会导致语法错误,而bar
不会,为什么?
假设我想评估带有返回语句的单行表达式(类似于某些常用的shell/bash表达式),这是否是一种推荐的方法,还是有更好的方法?
根据操作符结合性的强度,
true && return false
评估为
(true && return) false
true && return
这个语句是合法的,但它后面的false
是无效的。你不能在两个语句之间什么都不加地排列它们。
and
的优先级低于 &&
,正如@sawa所指出的那样,这就是为什么 foo
不起作用而 bar
起作用的原因,因为 bar
的计算结果符合您的预期。 - Donovan旁注
值得注意的是,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)
&&
运算符的优先级,以下行代码:true && return false
评估为
(true && return) false
这没有意义。为了执行您的代码,您需要使用
def foo
true && (return false)
end
and
没有遇到相同的问题,因为and
比&&
优先级低。
def foo
return false if true
end
def bar
return false if true
end
return不是一个函数 :) 因此说它没有意义
when true and return is ok send a false
&&
>and
)导致的,但有没有人能解释为什么return
位于它们之间?为什么return
不管怎样始终取其后面的参数/值? - Reinstate Monica -- notmaynard&&
比and
优先级高。我(通过示例隐含地)表达的是,&&
比return
方法调用(带参数)的优先级高。 - sawa