ActiveSupport将Object
扩展为具有实例方法blank?
:
class Object
def blank?
respond_to?(:empty?) ? !!empty? : !self
end
end
< p > “!!empty?”可以改写成“empty?”吗?这是一种风格选择,使其易于阅读为返回布尔值的方法吗?还是有其他原因?
!!
将响应从空转换为布尔值。在不同的对象上,空可能有不同的定义,因此在rails中,某人可能已经定义了.empty?
以不返回布尔值。由于.blank?
需要返回布尔值,因此需要使用!!
来确保返回布尔值。将一个“truthy”或“falsy”值转换为严格的true
和false
是一种常见的方法。
在Ruby中,经常用!!(something)
的方式来调用方法。计算结果将会是布尔值,而不是nil或其他类型:
!!(true) # true
!!(false) # false
!!(nil) # false
!!
用于将假值/真值强制转换为false/true:
irb(main):001:0> !!nil == false
=> true
empty?
。这是更改为!!empty?
的提交:https://github.com/rails/rails/commit/126dc47665c65cd129967cbd8a5926dddd0aa514
从评论中可以看出:
:为什么要双重使用!!
?它无论如何都会返回TrueClass
/FalseClass
:因为它是一种动态语言,受到多态性的影响,你不能只依赖于empty?
返回单例,你需要保证无论如何都返回一个。!
来返回非布尔值:class Foo
def !
nil
end
end
Foo.new.blank? #=> nil
为了处理empty?
和!
这两种方法,应该实现为:
!!(respond_to?(:empty?) ? empty? : !self)
self.respond_to?(:empty?)? !!self.empty? : !self
是一样的吧?我不明白为什么需要!!
,因为empty?
已经返回了一个布尔值。 - Cary Swoveland!!
。 - Stefan