Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 严格检查假值(不包括零)最危险的方法是什么?_Ruby - Fatal编程技术网

Ruby 严格检查假值(不包括零)最危险的方法是什么?

Ruby 严格检查假值(不包括零)最危险的方法是什么?,ruby,Ruby,检查值是否为false而不是nil(哪一个值为false)最危险的方法是什么 使用虚构方法的示例false?: a = false a.false? # should return true a = nil a.false? # should return false 到目前为止,我们有四种不同的方法: a == false # credits to @Ilya a.is_a?(FalseClass) FalseClass === a a.instance_

检查值是否为
false
而不是
nil
(哪一个值为false)最危险的方法是什么

使用虚构方法的示例
false?

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

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

a == false                 # credits to @Ilya

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

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

a.nil? ^ !a

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

a == false                 # credits to @Ilya

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

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

a.nil? ^ !a
我同意最简单的方法是不区分
nil
false

最面向对象的方法是允许对象自行决定它是否为假,就像您在问题中所做的那样:通过响应
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
我同意最简单的方法是不区分
nil
false

最面向对象的方法是允许对象自行决定它是否为假,就像您在问题中所做的那样:通过响应
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

使用
a==false
。我认为Ruby的方法是不区分false和false。我同意@spickermann的观点,我想不出需要显式检查false的情况。有一个流行的用例:在Rails 5之前,回调返回的
false
表示错误(停止回调链),而忽略了
nil
。这已更改(或修复)–回调现在必须抛出:abort。上下文类似于@SimpleTime所描述的内容。假设您有一个以hashmap表示的服务列表。这些服务可能实现了
选项
。如果实现了,则
选项
的值可能是
true
false
ce没有实现
选项
,调用
服务[:option]
返回
nil
,因为它没有键
选项
。如果有,调用
服务[:option]
可能返回
true
false
。在上面的示例中,我们只需要检索其
选项
已实现并设置为
false
的服务。使用
a==false
。我认为Ruby的方法是不区分false和false。我同意@spickermann,我想不出任何情况这里我需要显式地检查false。有一个流行的用例:在Rails 5之前,回调的返回值
false
表示错误(停止回调链),而
nil
被忽略。这被更改(或修复)–回调现在必须抛出:abort。上下文类似于@SimpleTime所描述的内容。假设您有一个以hashmap表示的服务列表。这些服务可能实现了
选项
。如果实现了,则
选项
的值可能是
true
false
ce没有实现
选项
,调用
服务[:option]
返回
nil
,因为它没有键
选项
。如果有,调用
服务[:option]
可能返回
true
false
。在上面的示例中,我们只需要检索其
选项
已实现并设置为
false
的服务。也可以
false.instance\u of?(FalseClass)
也可以
false.instance\u of?(FalseClass)