红宝石中`not`和`!`之间的区别


Answers:


143

它们几乎是同义词,但不完全相同。不同的是,!具有比更高的优先级not,就像&&||比更高的优先级的andor

!在所有运算符中具有最高的优先级,在所有运算符中具有最低的优先级not之一,您可以在Ruby docs上找到完整表

例如,请考虑:

!true && false
=> false

not true && false
=> true

在第一个示例中,!具有最高的优先级,因此您实际上是在说false && false
在第二个示例中,not的优先级低于true && false,因此这将“ false从”切换true && falsetrue

!除非您有特定的使用理由,否则通常应该遵循的准则是not!Ruby中的Ruby行为与大多数其他语言相同,并且没有令人惊讶not


6
过去,我使用'not'来使否定的条件语句更易于阅读。意思是说如果要否决整个条件,我会感到很舒服,可以使用“不”而不是“!”。我的代码读起来像印度绿的时候,我很喜欢
jaydel

@jaydel unless在这种情况下可以使用吗?
雅各布

1
@雅各布,是的,肯定的。unless在红宝石世界中并不是很受青睐。普遍的共识是,!在大多数情况下,它在正常工作时会受到阻碍。我敢肯定,在某些情况下,除非可能更具表现力,否则我会明确指出。
布伦南

4
我不同意那unless点。我们必须达成共识的最接近的说法是相反。
亚当·拉瑟克

1
只想分享一个令人惊讶的例子not。在Python中,有时会为变量分配布尔值,以使if语句更易于阅读。这可能意味着使用模式x = not y,其中y有点复杂。在Ruby中,x = !y可以使用,但是x = not y可以获取syntax error, unexpected tIDENTIFIER, expecting '('。优先顺序意味着这需要在作业op的右边加上括号:x = (not y)
S. Kirby

13

了解not操作员的一种简单方法是将其not true && false视为等同于!(true && false)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.