Ruby 如何缩短链接if/elsif语句?
我想缩短以下方法。在Ruby中,有没有什么聪明的方法可以通过使用迭代器、case语句等来实现这一点Ruby 如何缩短链接if/elsif语句?,ruby,Ruby,我想缩短以下方法。在Ruby中,有没有什么聪明的方法可以通过使用迭代器、case语句等来实现这一点 # Returns true iff this is a later date than the input date. def later_than?(date) if(@year < date.year) return false elsif(@year > date.year) return true end if(
# Returns true iff this is a later date than the input date.
def later_than?(date)
if(@year < date.year)
return false
elsif(@year > date.year)
return true
end
if(@month < date.month)
return false
elsif(@month > date.month)
return true
end
if(@day <= date.day)
return false
elsif(@day > date.day)
return true
end
end
如果输入日期晚于输入日期,则返回true。
def晚于?(日期)
如果(@year我知道,通过排除返回false的特定if语句,代码可以在某种程度上缩短,但我想知道是否有更好的方法?非常感谢您的建议。我认为这应该进行更大的重构,因为当您只能有一个time对象并执行以下操作时,存储三个不同的类变量是没有意义的:
def later_than?(date)
@time >= date
end
如果没有一个全局时间变量,您可以执行以下操作:
def later_than?(date)
Time.new(@year, @month, @day) >= date
end
这也会起作用:
def later_than?(date)
@year*10000+@month*100+@day > date.year*10000+date.month*100+date.day
end
我更喜欢这个版本:
def to_s
(@year*10000+@month*100+@day).to_s
end
def later_than?(date)
to_s > date.to_s
end
真的,你应该使用。您也不需要比较诸如
年
、月
和日
之类的属性,因为日期
实现了可比
。下面是使用您创建的任何自定义类的效果:
require 'date'
...
def later_than?(date)
Date.new(@year, @month, @day) > Date.new(date.year, date.month, date.day)
end
但请注意这里的冗余。我们只是在构建对象并进行比较。您可能只想构造那些Date
对象,或者使用某种方法返回一个Date
对象(如果您对日期执行更多操作,您将需要该对象),然后使用一个简单的
操作符,而不是创建一个晚于?的方法。如果您想在irb中查看它:
require 'date'
the_fourth = Date.new(2011, 7, 4)
christmas = Date.new(2011, 12, 25)
the_fourth > christmas # returns false
christmas > the_fourth # returns true
此外,如果您真的希望语义值的晚于?
,您可以执行以下操作
require 'date'
class Date
alias :later_than? :>
end
如果将其添加到类中:
include Comparable
def <=>(other)
[@year, @month, @day] <=> [other.year, other.month, other.day]
end
包括可比较的
def(其他)
[@year,@month,@day][other.year,other.month,other.day]
结束
您的自定义日期类突然获得了以下比较方法:=和之间的比较方法?
但正如其他人所说,只需使用ruby的date类。我同意使用ruby的date对象的其他建议。它非常适合您的需要,并且将为您节省大量代码来重新创建特定的轮子
关于使用if/elsif
逻辑的建议:
if(@year < date.year)
return false
elsif(@year > date.year)
return true
end
if(@month < date.month)
return false
elsif(@month > date.month)
return true
end
if(@day <= date.day)
return false
elsif(@day > date.day)
return true
end
if(@yeardate.year)
返回真值
结束
如果(@monthdate.month)
返回真值
结束
如果(@day date.day)
返回真值
结束
这是不必要的复杂。考虑这一点:
return false if ( @year < date.year )
return true if ( @year > date.year )
return false if ( @month < date.month )
return true if ( @month > date.month )
return true if ( @day > date.day )
return false
如果(@yeardate.year)返回true
如果(@monthdate.month)返回true
如果(@day>date.day)返回true
返回错误
我并不是说这适用于每种情况,也不是说这是你在这个特殊情况下应该使用的。相反,我想展示的是格式如何使人们更容易看到在重复的、类似的文本行中发生的变化
在编写代码时,请注意如何进行布局,并保持其清晰简洁。把它写下来,就像你在电话里给别人指示一样;您的代码是否像您在正常语音中所说的那样流动
编写代码时要考虑到维护,因为如果以后必须返回代码,您会希望代码易于理解。我建议使用其他方法,但不要使用if和elsif,您可以使用case
:
# Returns true iff this is a later date than the input date.
def later_than?(date)
case
when @year < date.year then false
when @year > date.year then true
when @month < date.month then false
when @month > date.month then true
when @day <= date.day then false
when @day > date.day then true
else raise "Shouldn't get here"
end
end
如果输入日期晚于输入日期,则返回true。
def晚于?(日期)
案例
当@yeardate.year时,则为true
当@monthdate.month时,则为true
当@day date.day为true时
否则我就“不应该到这里”
结束
结束
该方法不能写为return@year>date.year | | month>date.month | | day>date.day吗?当只需要if时,为什么要使用elseif?顺便问一下,这只是一个“例子”来说明你想要什么,还是这就是你所要求的方法?@Fire Dragon DoL:你对函数的简化会错误地告诉我们2008年1月2日比2009年1月1日晚。OP的函数是正确的,你对它的简化是错误的。Ruby有一个内置的Date
类,但听起来你好像在尝试编写自己的类。谢谢你提供的信息;那么,我会考虑改用内置类。@David:你说得对,但他提出的方法也有同样的问题,所以我“仿效”了完全可以。如果不需要,请注意不要比较一天中的时间。您应该使用日期
类而不是时间
类,并使用
而不是=
,否则这是一个好主意。如何在运算符之间添加一些空格以提高可读性?最好使用前一个版本,因为您不太可能在任何其他上下文中使用该方法,而且它涉及到不必要的字符串转换和不必要的对象实例化。你的生日晚于?方法可以使用而不是>,并将其重命名为自身,从而支持可比较的模块。:-)Vim的“对齐”和“环绕”插件使它非常容易做到这一点。通常我不喜欢这么多的回报,但是,是的,它似乎更有意义,因为它保持了它的简短和简单。