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