什么是严格检查虚假值(并排除零)的Rubiest方法?

时间:2017-12-07 16:06:25

标签: ruby

什么是Rubiest方式检查值是false而不是nil(这是一个假值)?

使用虚构方法false?的示例:

a = false
a.false? # should return true
a = nil
a.false? # should return false

2 个答案:

答案 0 :(得分:2)

到目前为止,我们有四种不同的方法:

a == false                 # credits to @Ilya

a.is_a?(FalseClass)
FalseClass === a

a.instance_of?(FalseClass) # credits to @Ilya

a.nil? ^ !a

答案 1 :(得分:2)

我同意@spickermann's comment to your question,认为区分nilfalse的方式最为方便。

OO 的方式是允许对象自行决定它是否为假,只是你在问题中的方式:通过回复false?消息。

class TrueClass
  def true?
    true
  end
end

class FalseClass
  def false?
    true
  end
end

class Object
  def true?
    false
  end

  def false?
    false
  end
end

如果你想成为一个好的Ruby公民,你将这些monkeypatches封装在一个mixin中,以便它们出现在祖先链中:

module StrictlyTrue
  def true?
    true
  end
end

class TrueClass
  include StrictlyTrue
end

module StrictlyFalse
  def false?
    true
  end
end

class FalseClass
  include StrictlyFalse
end

module NeitherFalseNorTrue
  def true?
    false
  end

  def false?
    false
  end
end

class Object
  include NeitherFalseNorTrue
end

如果你想要完全不错,你可以将其包装在精炼中:

module StrictlyTrue
  def true?
    true
  end
end

module StrictlyFalse
  def false?
    true
  end
end

module NeitherFalseNorTrue
  def true?
    false
  end

  def false?
    false
  end
end

module StrictBooleans
  refine TrueClass do
    include StrictlyTrue
  end

  refine FalseClass do
    include StrictlyFalse
  end

  refine Object do
    include NeitherFalseNorTrue
  end
end