2016-01-11 50 views
3

的ActiveSupport延伸Object与实例方法blank?`!!空吗?`是什么意思?

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

!!empty?被写为empty?代替?这是一种文体选择,以便它可以轻松地作为返回布尔值的方法进行读取?或者还有别的吗?

+0

我认为你认识到操作行与'self.respond_to?(:empty?)相同? !self.empty? :!自己?我不明白为什么'!!'是必须的,因为'empty?'返回一个布尔值。 –

+0

很好的阅读代码和澄清任何疑惑。这是学习新语言的好方法。 – Leito

+0

我已经重新提出这个问题,因为它有点不同。 OP专门询问为什么'!!'需要与应该返回布尔值的谓词方法结合使用。 – Stefan

回答

6

这样做的原因是,!!胁迫从空到布尔值的响应。 Empty可以在不同的对象上有不同的定义,所以有可能rails中的某个人可能已经定义了.empty?不返回布尔值。由于.blank?需要返回布尔值,因此需要!!以确保返回布尔值。

4

这是一种常见的方式来将truthy与falesy值转换为严格的truefalse

2

!!用于迫使falsey/truthy值假/真:

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

这是Ruby中常用的方法,称为!!(something)。计算的结果是布尔值,而不是零或别的东西:

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

事实上,它曾经是empty?。这里的承诺,它改为!!empty?https://github.com/rails/rails/commit/126dc47665c65cd129967cbd8a5926dddd0aa514

comments

Bartuz:
为什么双!!?它返回TrueClass/FalseClass anynway

FXN:
因为它是一个动态语言,受到多态性,你就不能依靠empty?返回单身,你需要保证的是,你回到一个没有有什么关系。然而

“改良”的实施是不完整的,因为你也可以同样实现!返回一个非布尔值:

class Foo 
    def ! 
    nil 
    end 
end 

Foo.new.blank? #=> nil 

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

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

你也应该在github页面发表评论。 –

+0

@CarySwoveland你是对的,我已经打开了拉请求。 – Stefan