【发布时间】:2011-04-18 19:08:11
【问题描述】:
def test
!!session[:test]
end
!! - 这是做什么的?我们可以删除它并仍然假设它会以相同的方式工作吗?
【问题讨论】:
-
请注意,这实际上与 Rails 无关。这是一个Ruby语言的东西。我已经相应地更改了标题和标签。
标签: ruby
def test
!!session[:test]
end
!! - 这是做什么的?我们可以删除它并仍然假设它会以相同的方式工作吗?
【问题讨论】:
标签: ruby
那就是double bang (or bang bang)。
它本身并不是一个真正的运算符。它实际上是两个 ! 运算符在一起......执行双重否定。它用于确保您使用的是布尔值。
【讨论】:
第一个! 将其操作数强制为布尔值,然后取反。第二个! 否定否定值。总和效果是将操作数强制为布尔类型。因此,如果您更改它,那么该方法将不再返回布尔值,它将返回该符号的散列中的任何内容。如果你删除它,什么都不会改变,但使用!! 的好处是你不能滥用方法调用从会话中获取对象。
【讨论】:
为了解决您的第二个问题,如果您删除双重否定,您的方法将发生微妙的变化,因为您将返回对象而不是 TrueClass 或 FalseClass。
!!除非您明确需要布尔值(例如,如果您正在构建 API),否则通常不赞成。由于 Ruby 将任何非 nil 和非 false 值评估为真值,因此通常只返回有问题的对象以便调用其方法是安全的。
【讨论】: