的ActiveSupport延伸Object
与实例方法blank?
:`!!空吗?`是什么意思?
class Object
def blank?
respond_to?(:empty?) ? !!empty? : !self
end
end
能!!empty?
被写为empty?
代替?这是一种文体选择,以便它可以轻松地作为返回布尔值的方法进行读取?或者还有别的吗?
的ActiveSupport延伸Object
与实例方法blank?
:`!!空吗?`是什么意思?
class Object
def blank?
respond_to?(:empty?) ? !!empty? : !self
end
end
能!!empty?
被写为empty?
代替?这是一种文体选择,以便它可以轻松地作为返回布尔值的方法进行读取?或者还有别的吗?
这样做的原因是,!!
胁迫从空到布尔值的响应。 Empty可以在不同的对象上有不同的定义,所以有可能rails中的某个人可能已经定义了.empty?
不返回布尔值。由于.blank?
需要返回布尔值,因此需要!!
以确保返回布尔值。
这是一种常见的方式来将truthy与falesy值转换为严格的true
和false
。
!!
用于迫使falsey/truthy值假/真:
irb(main):001:0> !!nil == false
=> true
这是Ruby中常用的方法,称为!!(something)
。计算的结果是布尔值,而不是零或别的东西:
!!(true) # true
!!(false) # false
!!(nil) # false
事实上,它曾经是empty?
。这里的承诺,它改为!!empty?
:https://github.com/rails/rails/commit/126dc47665c65cd129967cbd8a5926dddd0aa514
从comments:
Bartuz:
为什么双!!
?它返回TrueClass
/FalseClass
anynwayFXN:
因为它是一个动态语言,受到多态性,你就不能依靠empty?
返回单身,你需要保证的是,你回到一个没有有什么关系。然而
“改良”的实施是不完整的,因为你也可以同样实现!
返回一个非布尔值:
class Foo
def !
nil
end
end
Foo.new.blank? #=> nil
处理这两种方法(empty?
和!
),它应该实施为:
!!(respond_to?(:empty?) ? empty? : !self)
你也应该在github页面发表评论。 –
@CarySwoveland你是对的,我已经打开了拉请求。 – Stefan
我认为你认识到操作行与'self.respond_to?(:empty?)相同? !self.empty? :!自己?我不明白为什么'!!'是必须的,因为'empty?'返回一个布尔值。 –
很好的阅读代码和澄清任何疑惑。这是学习新语言的好方法。 – Leito
我已经重新提出这个问题,因为它有点不同。 OP专门询问为什么'!!'需要与应该返回布尔值的谓词方法结合使用。 – Stefan