【问题标题】:How do I create a class which instance can be evaluated as false? [duplicate]如何创建一个实例可以被评估为假的类? [复制]
【发布时间】:2011-10-14 18:46:55
【问题描述】:

我想创建一个类 Nilly 来获取“伪零”对象,但我需要将其评估为布尔值 false

例如:

class Nilly; end

n = Nilly.new

puts n ? 'true' : 'false'    #=>  I want false here

我该怎么做?

P.S.:我尝试做class Nilly < NilClass,但我无法使用new 方法(它在NilClass 中被剥离)。

【问题讨论】:

  • 没有实例(谢天谢地:-)
  • 这两个问题有相似之处,但它们似乎不同,值得同时保留它们。这个问题是关于如何制作一个像 nil 一样的对象,这是如何制作一个 falsy 的对象。这些问题中的每一个都可以有独特的答案。

标签: ruby boolean


【解决方案1】:

Ruby 中的布尔逻辑仅允许 nilfalsefalsy

其他都是truthy

没有办法做到这一点。

请问你为什么要这个? 您的Nilly 课程有什么特别之处?

我建议你换一种方式来称呼它。

class Nilly
  def nil?
    true
  end
end

并在你的逻辑中使用它

puts n.nil? ? 'false' : 'true'

【讨论】:

  • this question 中,作者不想重新定义NilClass#method_missing,因为那样会非常侵扰。所以,我想知道要使用替代类来做到这一点。
  • 您应该查看在ActiveSupport 中定义的trysomething.try(:a_method)nil 返回nil,否则调用something.a_method
  • 事实上,如果我只需要一个 method_missing 返回 nil 的类,并且如果我不需要将它评估为布尔值,它不需要需要继承NilClass。我会考虑的。
  • 是的,我认为答案不是创建magic nil,而是以不同的方式解决您的问题。
【解决方案2】:

覆盖新方法:

class Nilly < NilClass
  def Nilly.new
  end
end

n = Nilly.new
puts n ? 'true' : 'false'    #=>  I want false here

与前两种解决方案不同,这正是您想要的。 n 实际上评估为 nil,无需使用 nil? 方法进行测试。 to_s 解决方案之所以有效,是因为您正在 putsing 它,它隐式调用 to_s

【讨论】:

  • 妈的,我总是来晚了……
  • 你只是返回nil。在这种情况下,您不妨忽略Nilly 定义,并说n = nil
  • 不:这正是作者想要的。如果我没看错,他希望一个类“被评估为布尔假”。为此,该类必须是 NilClass 子级或 FalseClass 子级,tertium non datur。顺便说一句,我返回nil
  • 您返回的是零。请尝试您的代码。 n 完全为零。它不是 Nilly 的一个实例。
  • Ruby 1.8.7:n.inspect 返回“nil”。我打开了Nillydef to_s; 'nilly'; end,但n.to_s 返回“”。
猜你喜欢
  • 2017-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-25
  • 2014-08-10
  • 2015-01-15
  • 1970-01-01
相关资源
最近更新 更多