3

ActiveSupport 扩展Object了一个实例方法blank?

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

可以!!empty?写成empty?吗?这是一种风格选择,因此它可以作为返回布尔值的方法轻松阅读?或者还有别的什么?

4

5 回答 5

6

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

于 2016-01-11T18:49:48.337 回答
4

这是将真值与假值转换为严格true和的常用方法false

于 2016-01-11T18:49:23.067 回答
3

在 Ruby 中调用!!(something). 计算的结果将是布尔值,而不是 nil 或其他:

!!(true) # true
!!(false) # false
!!(nil) # false
于 2016-01-11T18:54:37.243 回答
2

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

评论

巴图兹:
为什么要加倍!!?它返回TrueClass/FalseClass无论如何

fxn:
因为它是一种动态语言并且受制于多态性,所以你不能依赖empty?返回单例,你需要保证无论如何你都返回一个。

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

class Foo
  def !
    nil
  end
end

Foo.new.blank? #=> nil

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

!!(respond_to?(:empty?) ? empty? : !self)
于 2016-01-11T20:48:52.720 回答
2

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

irb(main):001:0> !!nil == false
=> true
于 2016-01-11T18:49:27.637 回答