在ruby中是否有一种比较可能为零的对象的模式?

在ruby中是否有一种比较可能为零的对象的模式?,ruby,null,Ruby,Null,我需要比较潜在的nil对象。比如说, Foo.new(Date.new) < Foo.new(nil) # => true Foo.new(nil) < Foo.new(Date.new) # => true class Foo attr_accessor :time def initialize(time) @time = time end def <=>(other) # I don't know what

我需要比较潜在的
nil
对象。比如说,

Foo.new(Date.new) < Foo.new(nil)
  # => true

Foo.new(nil) < Foo.new(Date.new)
  # => true

class Foo 
  attr_accessor :time
  def initialize(time)
    @time = time
  end

  def <=>(other)
    # I don't know what to do here.
  end
end
Foo.new(Date.new)正确
Foo.new(无)正确
福班
属性存取器:时间
def初始化(时间)
@时间=时间
结束
def(其他)
#我不知道在这里该怎么办。
结束
结束

有没有一种模式可以解决这样的问题?

您可以定义一种
Foo#to_f
方法:

  • 如果定义了
    @time
    ,它将
    @time.to\u f
  • 如果
    @time
    为零,则返回负无穷大
这样,
Foo.new(nil)
比任何其他
Foo
都小

require 'date'
class Foo
  attr_accessor :time
  include Comparable
  def initialize(time)
    @time = time && time.to_time # time can be nil, a Date or a Time
  end

  def to_f
    @time ? @time.to_f : -Float::INFINITY
  end

  def <=>(other)
    to_f <=> other.to_f
  end

  def to_s
    @time ? @time.strftime('%Y-%m-%d') : 'nil'
  end

  alias inspect to_s
end

p Foo.new(Date.new) < Foo.new(nil)
# false

p Foo.new(nil) < Foo.new(Date.new)
# true

p [Foo.new(Date.today), Foo.new(nil), Foo.new(Date.new(2015, 3, 1)), Foo.new(Date.new(2018, 5, 14)), Foo.new(Time.now + 3600)].sort
# [nil, 2015-03-01, 2017-06-24, 2017-06-25, 2018-05-14]
需要“日期”
福班
属性存取器:时间
包括可比
def初始化(时间)
@time=time&&time.to#u time#时间可以是零、日期或时间
结束
def to_f
@时间@time.to_f:-浮点::无穷大
结束
def(其他)
给其他人
结束
def至美国
@时间@time.strftime(“%Y-%m-%d”):“nil”
结束
别名检查到
结束
p Foo.new(日期新)
使用空对象模式重构
需要“日期”
零班制
def to_f
-浮点::无穷大
结束
def strftime(*)
“零”
结束
结束
福班
属性存取器:时间
包括可比
def初始化(时间=零)
@时间=如果时间。响应时间(:响应时间)
时间到了
其他的
NilTime.new
结束
结束
def to_f
@时间到了
结束
def(其他)
给其他人
结束
def至美国
@time.strftime(“%Y-%m-%d”)
结束
别名检查到
结束

您可以定义
Foo#to_f
方法:

  • 如果定义了
    @time
    ,它将
    @time.to\u f
  • 如果
    @time
    为零,则返回负无穷大
这样,
Foo.new(nil)
比任何其他
Foo
都小

require 'date'
class Foo
  attr_accessor :time
  include Comparable
  def initialize(time)
    @time = time && time.to_time # time can be nil, a Date or a Time
  end

  def to_f
    @time ? @time.to_f : -Float::INFINITY
  end

  def <=>(other)
    to_f <=> other.to_f
  end

  def to_s
    @time ? @time.strftime('%Y-%m-%d') : 'nil'
  end

  alias inspect to_s
end

p Foo.new(Date.new) < Foo.new(nil)
# false

p Foo.new(nil) < Foo.new(Date.new)
# true

p [Foo.new(Date.today), Foo.new(nil), Foo.new(Date.new(2015, 3, 1)), Foo.new(Date.new(2018, 5, 14)), Foo.new(Time.now + 3600)].sort
# [nil, 2015-03-01, 2017-06-24, 2017-06-25, 2018-05-14]
需要“日期”
福班
属性存取器:时间
包括可比
def初始化(时间)
@time=time&&time.to#u time#时间可以是零、日期或时间
结束
def to_f
@时间@time.to_f:-浮点::无穷大
结束
def(其他)
给其他人
结束
def至美国
@时间@time.strftime(“%Y-%m-%d”):“nil”
结束
别名检查到
结束
p Foo.new(日期新)
使用空对象模式重构
需要“日期”
零班制
def to_f
-浮点::无穷大
结束
def strftime(*)
“零”
结束
结束
福班
属性存取器:时间
包括可比
def初始化(时间=零)
@时间=如果时间。响应时间(:响应时间)
时间到了
其他的
NilTime.new
结束
结束
def to_f
@时间到了
结束
def(其他)
给其他人
结束
def至美国
@time.strftime(“%Y-%m-%d”)
结束
别名检查到
结束
另一种方法

零对零是0

    nil_obj.to_i < date_obj.to_i

    Foo.new(nil.to_i) < Foo.new(Date.to_i) # true
nil_obj.to_i
另一种方法

零对零是0

    nil_obj.to_i < date_obj.to_i

    Foo.new(nil.to_i) < Foo.new(Date.to_i) # true
nil_obj.to_i
你想要什么样的行为?假设我有用户,我想看看谁发布了最近的评论,我想将这些评论与
userA.recent\u comment>userB.recent\u comment
,但是userB没有任何评论。我想创建一个
NullComment
类,或者创建一个当传入的注释为nil时能够适当响应的类。userA的评论比userB的评论更新,因为userB没有评论。但他的评论也不是最近才发表的。我在问题中有一段比较,你可以看看空对象模式。一般原则是创建一个对象,该对象响应与注释相同的消息,但表示没有注释。看看这个:@wry\u不满:你说的逻辑一致是什么意思?例如,您问题中的代码在逻辑上不一致。nil值小于或大于任何当前值(这定义了排序顺序,正是
所做的事情)。不能两者兼而有之,甚至忘记零。看看你的代码。它断言
a
。在下一行,它还断言
b
。这没有意义,是吗?你想要什么样的行为?假设我有用户,我想看看谁发布了最近的评论,我想将评论与
userA.recent_comment>userB.recent_comment
,但是userB没有任何评论。我想创建一个
NullComment
类,或者创建一个当传入的注释为nil时能够适当响应的类。userA的评论比userB的评论更新,因为userB没有评论。但他的评论也不是最近才发表的。我在问题中有一段比较,你可以看看空对象模式。一般原则是创建一个对象,该对象响应与注释相同的消息,但表示没有注释。看看这个:@wry\u不满:你说的逻辑一致是什么意思?例如,您问题中的代码在逻辑上不一致。nil值小于或大于任何当前值(这定义了排序顺序,正是
所做的事情)。不能两者兼而有之,甚至忘记零。看看你的代码。它断言
a