在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