`!!empty?` 是什么意思?
What is the meaning of `!!empty?`?
ActiveSupport 使用实例方法扩展 Object
blank?
:
class Object
def blank?
respond_to?(:empty?) ? !!empty? : !self
end
end
!!empty?
可以写成 empty?
吗?这是一种文体选择,以便它可以作为返回布尔值的方法轻松阅读吗?还是有其他的?
将真值和假值转换为严格的true
和false
是一种常见的方法。
!!
用于将 falsey/truthy 值强制为 false/true:
irb(main):001:0> !!nil == false
=> true
原因是 !!
将响应从空值强制转换为布尔值。 Empty 可以在不同的对象上有不同的定义,因此 rails 中的某个人可能将 .empty?
定义为非 return 布尔值。由于 .blank?
需要 return 布尔值,因此需要 !!
来确保布尔值被 returned.
在Ruby中调用!!(something)
是一种常见的方法。计算结果将是布尔值,而不是 nil 或其他:
!!(true) # true
!!(false) # false
!!(nil) # false
其实以前是empty?
。这是将其更改为 !!empty?
的提交:https://github.com/rails/rails/commit/126dc47665c65cd129967cbd8a5926dddd0aa514
来自comments:
Bartuz:
Why double !!
? It returns the TrueClass
/ FalseClass
anynway
fxn:
Because it is a dynamic language and subject to polymorphism, you just can't rely on empty?
returning singletons, what you need to guarantee is that you return one no matter what.
但是 "improved" 实现是不完整的,因为您也可以将 !
实现为 return 一个 non-boolean 值:
class Foo
def !
nil
end
end
Foo.new.blank? #=> nil
要处理这两种方法(empty?
和 !
),它应该实现为:
!!(respond_to?(:empty?) ? empty? : !self)
ActiveSupport 使用实例方法扩展 Object
blank?
:
class Object
def blank?
respond_to?(:empty?) ? !!empty? : !self
end
end
!!empty?
可以写成 empty?
吗?这是一种文体选择,以便它可以作为返回布尔值的方法轻松阅读吗?还是有其他的?
将真值和假值转换为严格的true
和false
是一种常见的方法。
!!
用于将 falsey/truthy 值强制为 false/true:
irb(main):001:0> !!nil == false
=> true
原因是 !!
将响应从空值强制转换为布尔值。 Empty 可以在不同的对象上有不同的定义,因此 rails 中的某个人可能将 .empty?
定义为非 return 布尔值。由于 .blank?
需要 return 布尔值,因此需要 !!
来确保布尔值被 returned.
在Ruby中调用!!(something)
是一种常见的方法。计算结果将是布尔值,而不是 nil 或其他:
!!(true) # true
!!(false) # false
!!(nil) # false
其实以前是empty?
。这是将其更改为 !!empty?
的提交:https://github.com/rails/rails/commit/126dc47665c65cd129967cbd8a5926dddd0aa514
来自comments:
Bartuz:
Why double!!
? It returns theTrueClass
/FalseClass
anynwayfxn:
Because it is a dynamic language and subject to polymorphism, you just can't rely onempty?
returning singletons, what you need to guarantee is that you return one no matter what.
但是 "improved" 实现是不完整的,因为您也可以将 !
实现为 return 一个 non-boolean 值:
class Foo
def !
nil
end
end
Foo.new.blank? #=> nil
要处理这两种方法(empty?
和 !
),它应该实现为:
!!(respond_to?(:empty?) ? empty? : !self)