Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/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方法返回nil?_Ruby_Arrays_Time_Refactoring_Null - Fatal编程技术网

为什么这个重构的ruby方法返回nil?

为什么这个重构的ruby方法返回nil?,ruby,arrays,time,refactoring,null,Ruby,Arrays,Time,Refactoring,Null,我在类Float中编写了一个方法,它接受一个Float(秒),并将其转换为倒计时计时器。当我这样编写代码时,代码运行良好: class Float def to_countdown (self % 60) == 1 ? cd_sec = "#{(self % 60).to_i} second" : ( (self % 60).to_i == 0 ? cd_sec = "" : cd_sec = "#{(self % 60).to_i} seconds" ) ((self/60

我在类Float中编写了一个方法,它接受一个Float(秒),并将其转换为倒计时计时器。当我这样编写代码时,代码运行良好:

class Float
  def to_countdown
    (self % 60) == 1 ? cd_sec = "#{(self % 60).to_i} second" : ( (self % 60).to_i == 0 ? cd_sec = "" : cd_sec = "#{(self % 60).to_i} seconds" )
    ((self/60) % 60) == 1 ? cd_min = "#{((self/60) % 60).to_i} minute" : ( ((self/60) % 60).to_i == 0 ? cd_min = "" : cd_min = "#{((self/60) % 60).to_i} minutes" )
    (self/3600) == 1 ? cd_hour = "#{(self/3600).to_i} hour" : ( (self/3600).to_i == 0 ? cd_hour = "" : cd_hour = "#{(self/3600).to_i} hours" )
    (self/(60*60*24)) == 1 ? cd_day = "#{(self/(60*60*24)).to_i} day" : ( (self/(60*60*24)).to_i == 0 ? cd_day = "" : cd_day = "#{(self/(60*60*24)).to_i} days" )
    countdown = [cd_day, cd_hour, cd_min, cd_sec].reject! {|c| c == nil}
    return countdown.to_sentence
  end
end

509330.546146.to_countdown => "x days, y hours, z minutes, and a seconds"
我想重构它。我的最终结果是:

class Float
  def to_countdown
    s,m,h,d = (self % 60),((self/60) % 60),((self/3600)%24),(self/(60*60*24))
    s == 1 ? cd_sec  = "#{s.to_i} second" : ( s.to_i == 0 ? cd_sec  = "" : cd_sec  = "#{s.to_i} seconds" )
    m == 1 ? cd_min  = "#{m.to_i} minute" : ( m.to_i == 0 ? cd_min  = "" : cd_min  = "#{m.to_i} minutes" )
    h == 1 ? cd_hour = "#{h.to_i} hour"   : ( h.to_i == 0 ? cd_hour = "" : cd_hour = "#{h.to_i} hours" )
    d == 1 ? cd_day  = "#{d.to_i} day"    : ( d.to_i == 0 ? cd_day  = "" : cd_day  = "#{d.to_i} days" )
    countdown = [cd_day, cd_hour, cd_min, cd_sec].reject! {|c| c == nil}
    return countdown.to_sentence
  end
end
当我尝试重构版本时,我得到:

509330.546146.to_countdown => **undefined method `to_sentence' for nil:NilClass>.** 
这意味着
倒计时
nil
。重构版本中我做错了什么?

替换此版本

countdown = [cd_day, cd_hour, cd_min, cd_sec].reject! {|c| c == nil}
用这个

countdown = [cd_day, cd_hour, cd_min, cd_sec].compact

另外,您正在使用bang版本。它在适当的位置对数组进行变异,并将其删除。如果您想继续使用
reject
,请使用常规版本(非bang)。

您可以像这样进一步重构这些行
cd_sec=s==1?“#{s.to_i}秒”:(s.to_i==0?”:“#{s.to_i}秒”)
不要给出代码,让读者猜测。而是给出输入和预期输出的内容。抱歉,我将编辑我的代码以同时显示这两个内容!在这种情况下,Sergio的
compact
是更好的选择,请注意,您可以执行“拒绝”之类的操作!(&:nil?)而不是包含块并进行显式比较。非常感谢!这解决了我的问题。这是一个如此明显的答案,以至于我投了赞成票吗?@SeanLarkin:可能有人这么认为。您正在返回
拒绝的结果,所以大多数人的第一个想法是查看文档中的
拒绝
,表示如果数组未更改,则返回
nil
。但不要让它让你失望。当你是新来的,你就是新来的。很公平!我很欣赏这种洞察力。我只是一个信仰者,如果你要否决投票,请解释一下原因,这样人们(犯错误的人)就可以改正错误并从中吸取教训,因此不得不问。