繁体   English   中英

有什么用!! ruby 是什么意思?

[英]What does !! mean in ruby?

只是想知道什么!! 在 Ruby 中。

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

!!nil   #=> false
!!"abc" #=> true
!!false #=> false

但通常没有必要使用,因为 Ruby 的唯一错误值是nilfalse ,因此通常最好让该约定成立。

把它想象成

!(!some_val)

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

它返回true ,如果右边的对象不是nil ,而不是falsefalse ,如果它是nilfalse

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类型,规范值为01 以这个例子为例(为了清楚起见添加了括号):

!(1234) == 0
!(0) == 1
!(!(1234)) == 1

“not-not”语法将任何非零整数转换为1 ,即规范的布尔真值。

不过,总的来说,我发现进行合理的比较比使用这个不常见的习语要好得多:

int x = 1234;
if (!!x); // wtf mate
if (x != 0); // obvious

如果您需要执行独占或. 复制马特范霍恩的答案,稍作修改:

1 ^ true
TypeError: can't convert true into Integer

!!1 ^ !!true
=> false

我用它来确保两个变量要么都是 nil,要么都不是 nil。

raise "Inconsistency" if !!a ^ !!b

这是“双重否定”,但不鼓励这种做法。 如果您正在使用rubocop ,您会看到它抱怨此类代码违反Style/DoubleNegation

理由是

由于这既神秘又通常是多余的,应该避免[然后释义:] 将!!something更改为!something.nil?

如果您需要将枚举转换为布尔值,了解它的工作原理会很有用。 我有使用classy_enum gem 做到这一点的代码:

class LinkStatus < ClassyEnum::Base
  def !
    return true
  end
end

class LinkStatus::No < LinkStatus
end

class LinkStatus::Claimed < LinkStatus
  def !
    return false
  end
end

class LinkStatus::Confirmed < LinkStatus
  def !
    return false
  end
end

class LinkStatus::Denied < LinkStatus
end

然后在我的服务代码中,例如:

raise Application::Error unless !!object.link_status   # => raises exception for "No" and "Denied" states.

实际上,bangbang 运算符已成为我本来可以编写为名为 to_bool 的方法的内容。

其他答案都讨论了什么!! 是否以及它是否是好的做法。

但是,没有一个答案给出将值转换为布尔值的“标准 Ruby 方式”。

true & variable

TrueClass是 Ruby 值true的类,它实现了一个方法& ,其记录如下:

如果objnilfalse ,则返回false ,否则返回true

当标准库已经覆盖时,为什么要使用肮脏的双重否定?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM