什么!! 红宝石意味着什么?

Cam*_*ron 127 ruby

只是想知道!!Ruby中有什么.

Ale*_*yne 157

不是这样的.它用于将值转换为布尔值:

!!nil   #=> false
!!"abc" #=> true
!!false #=> false
Run Code Online (Sandbox Code Playgroud)

它通常是没有必要,因为虽然到Ruby的唯一错误值是使用nilfalse,因此它通常最好让该公约的立场.

把它想象成

!(!some_val)
Run Code Online (Sandbox Code Playgroud)

它合法使用的一件事是防止返回大量数据.例如,您可能不希望在has_image?方法中返回3MB的图像数据,或者您可能不希望在logged_in?方法中返回整个用户对象.使用!!将这些对象转换为简单的true/ false.

  • @ DSimon,有时你需要担心大对象,比如在调试期间打印或记录值. (10认同)
  • 使用它并不是一个坏习惯.Double bang经常用在谓词(以?结尾的方法)中,以返回显式的布尔值. (7认同)
  • Alex,你真的不需要担心返回大对象,因为Ruby会返回一个引用,而不是对象的副本. (6认同)
  • 所以这是一个双重否定? (3认同)
  • 当您的价值是booelan时,会有所不同.`!! true#=> true`和`true.nil?#=> false` (3认同)

Ric*_*chH 29

它返回true如果右边的对象不是nilfalse,false如果是nilfalse

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是完全相同的流动,但有些人觉得有用就明确地返回一个布尔值.


Tom*_*Tom 6

请注意,这个习语也存在于其他编程语言中.C没有内在bool类型,因此所有布尔值都被输入,int而规范值为01.采用此示例(为清晰起见,添加了括号):

!(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)