Ale*_*yne 157
不是这样的.它用于将值转换为布尔值:
!!nil #=> false
!!"abc" #=> true
!!false #=> false
Run Code Online (Sandbox Code Playgroud)
它通常是没有必要,因为虽然到Ruby的唯一错误值是使用nil和false,因此它通常最好让该公约的立场.
把它想象成
!(!some_val)
Run Code Online (Sandbox Code Playgroud)
它合法使用的一件事是防止返回大量数据.例如,您可能不希望在has_image?方法中返回3MB的图像数据,或者您可能不希望在logged_in?方法中返回整个用户对象.使用!!将这些对象转换为简单的true/ false.
Ric*_*chH 29
它返回true如果右边的对象不是nil不false,false如果是nil或false
def logged_in?
!!@current_user
end
Run Code Online (Sandbox Code Playgroud)
Aug*_*aas 14
!意味着否定布尔状态,!除了双重否定之外,两个s没有什么特别之处.
!true == false
# => true
Run Code Online (Sandbox Code Playgroud)
它通常用于强制方法返回布尔值.它将检测任何类型的真实性,例如字符串,整数和不是,并将其转换为布尔值.
!"wtf"
# => false
!!"wtf"
# => true
Run Code Online (Sandbox Code Playgroud)
一个更真实的用例:
def title
"I return a string."
end
def title_exists?
!!title
end
Run Code Online (Sandbox Code Playgroud)
当您想确保返回布尔值时,这非常有用.恕我直言,这是一种毫无意义的,不过,看到这两个if 'some string'和if true是完全相同的流动,但有些人觉得有用就明确地返回一个布尔值.
请注意,这个习语也存在于其他编程语言中.C没有内在bool类型,因此所有布尔值都被输入,int而规范值为0或1.采用此示例(为清晰起见,添加了括号):
!(1234) == 0
!(0) == 1
!(!(1234)) == 1
Run Code Online (Sandbox Code Playgroud)
"not-not"语法将任何非零整数转换1为规范布尔值true.
但总的来说,我发现进行合理的比较比使用这种不常见的习语要好得多:
int x = 1234;
if (!!x); // wtf mate
if (x != 0); // obvious
Run Code Online (Sandbox Code Playgroud)