ruby 中 “not” 和 “!” 的区别

Difference between "not" and "!" in ruby

提问人:kingsfoil 提问时间:12/12/2014 最后编辑:rlandsterkingsfoil 更新时间:3/3/2022 访问量:91928

问:

是同义词,还是它们的评价不同?not!

Ruby 布尔逻辑

评论

1赞 Tim Abell 8/9/2019
参见 stackoverflow.com/questions/21060234/...

答:

198赞 Brennan 12/12/2014 #1

它们几乎是同义词,但不完全是。区别在于 的优先级高于 ,与 非常相似,并且比 和 的优先级更高。!not&&||andor

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

例如,请考虑:

!true && false
=> false

not true && false
=> true

在第一个示例中,具有最高的优先级,因此您实际上是在说 .
在第二个示例中,优先级低于 ,因此将 from “切换”为 。
!false && falsenottrue && falsefalsetrue && falsetrue

一般的准则似乎是你应该坚持,除非你有特定的理由使用。 在 Ruby 中,它的行为与大多数其他语言相同,并且比 “不那么令人惊讶”。!not!not

评论

8赞 jaydel 7/12/2016
我过去曾使用“not”来使否定条件更易于阅读。意思是,如果整个条件都应该被否定,我觉得使用“not”而不是“!”很舒服。当我的代码读起来像 inglush 时,我喜欢它
0赞 Jacob 11/24/2017
@jaydel 在这种情况下,你能用吗?unless
1赞 Brennan 11/28/2017
@Jacob,是的,当然。 只是在 Ruby 世界中并不真正受到青睐。普遍的共识是,在大多数情况下,当工作同样顺利时,它只会妨碍。我敢肯定,在某些情况下,除非可能更具表现力,但我避开了。unless!
8赞 Adam Lassek 6/8/2018
我不同意这是不受欢迎的。我们最接近共识的事情却不是这样。unless
2赞 S. Kirby 10/5/2018
只是想分享一个例子,说明它是多么令人惊讶。在 Python 中,我有时会为变量分配布尔值,以使 if 语句更易于阅读。这可能意味着使用模式,其中 y 是复杂的东西。在 Ruby 中,有效,但得到 .优先顺序意味着这需要在赋值操作的权限周围加上括号才能工作:。notx = not yx = !yx = not ysyntax error, unexpected tIDENTIFIER, expecting '('x = (not y)
19赞 roniegh 3/17/2018 #2

理解运算符的一个简单方法是将notnot true && false!(true && false)

1赞 Rich Steinmetz 2/21/2021 #3

我这里有一个 RSpec 驱动的示例Ruby 的 not 关键字不是不是而是!(不是)

基本上:

  • 它们的优先级不同
  • 它们不是别名
  • !可以被覆盖,而不能被覆盖not
  • 当您覆盖时,也会被覆盖,因此它必须在引擎盖下使用!not!