`!! empty?`是什么意思?

时间:2016-01-11 18:43:44

标签: ruby boolean negation

ActiveSupport使用实例方法Object扩展blank?

class Object
  def blank?
    respond_to?(:empty?) ? !!empty? : !self
  end
end

!!empty?可以写成empty?吗?这是一个风格选择,以便它作为返回布尔值的方法轻松读取?或者还有其他什么?

5 个答案:

答案 0 :(得分:6)

原因是!!强制从空到布尔的响应。可以在不同对象上以不同方式定义Empty,因此rails中的某个人可能已定义.empty?以不返回布尔值。由于.blank?需要返回一个布尔值,因此需要!!来确保返回布尔值。

答案 1 :(得分:4)

这是将truthy与falesy值转换为严格truefalse的常用方法。

答案 2 :(得分:3)

在Ruby中调用!!(something)是一种常见的方法。计算的结果将是布尔值,而不是零或其他:

!!(true) # true
!!(false) # false
!!(nil) # false

答案 3 :(得分:2)

!!用于将falsey / truthy值强制为false / true:

irb(main):001:0> !!nil == false
=> true

答案 4 :(得分:2)

事实上,它曾经是empty?。这是将其更改为!!empty?的提交:https://github.com/rails/rails/commit/126dc47665c65cd129967cbd8a5926dddd0aa514

来自comments

  

<强> Bartuz:
  为什么加倍!!?它会返回TrueClass / FalseClass无论如何

     

<强> FXN:
  因为它是一种动态语言并且受多态性的影响,所以你不能依赖于empty?返回单例,你需要保证的是你无论如何都会返回它。

然而,“改进的”实现是不完整的,因为你也可以实现!来返回非布尔值:

class Foo
  def !
    nil
  end
end

Foo.new.blank? #=> nil

要处理这两种方法(empty?!),它应该实现为:

!!(respond_to?(:empty?) ? empty? : !self)