Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.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 如何缩短链接if/elsif语句?_Ruby - Fatal编程技术网

Ruby 如何缩短链接if/elsif语句?

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(

我想缩短以下方法。在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(@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晚于?(日期) 如果(@yeardate.year) 返回真值 结束 如果(@monthdate.month) 返回真值 结束 如果(@day date.day) 返回真值 结束 结束 我可以补充说,该方法属于名为Date的类,以及三个类成员:year、month和day


我知道,通过排除返回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的“对齐”和“环绕”插件使它非常容易做到这一点。通常我不喜欢这么多的回报,但是,是的,它似乎更有意义,因为它保持了它的简短和简单。