Ruby:返回值或nil

时间:2013-10-24 16:26:58

标签: ruby-on-rails ruby return-value null

我在Rails中使用此方法,并且在参数date_string中传递时它会跳起来nil。特别是当GetFileInfo -d返回nil时。

Rails-y的处理方法是什么?

def calling_method
  ...
  m = MyModel.create(creation_date: cdate_for(path))
  ...
end

def cdate_for(path)
  local_datetime_for(`GetFileInfo -d "#{path}"`.chomp!)
end

def local_datetime_for(date_string)
  t = Time.strptime(date_string, '%m/%d/%Y %H:%M:%S') 
  DateTime.parse(t.to_s)
end

可以从此返回nil,假设Model.create(creation_date: return_value_here)可以处理nil值。

编辑添加了一些其他方法来说明调用链。

5 个答案:

答案 0 :(得分:2)

您可以使用.blank?

def local_datetime_for(date_string)
  return nil if date_string.blank?
  t = Time.strptime(date_string, '%m/%d/%Y %H:%M:%S') 
  DateTime.parse(t.to_s)
end

.blank?的一些用例:

1.9.3p448 :042 > false.blank?
 => true 
1.9.3p448 :043 > true.blank?
 => false 
1.9.3p448 :044 > [].blank?
 => true 
1.9.3p448 :045 > ''.blank?
 => true 
1.9.3p448 :046 > '1'.blank?
 => false 
1.9.3p448 :047 > nil.blank?
 => true 

(对于记录,.present?.blank?)完全相反

答案 1 :(得分:1)

我认为习惯性的Ruby要求:

def local_datetime_for(date_string)
  unless date_string.blank?
    t = Time.strptime(date_string, '%m/%d/%Y %H:%M:%S') 
    DateTime.parse(t.to_s)
  end
end

或者如果你想要花哨:

def local_datetime_for(date_string)
    DateTime.parse(Time.strptime(date_string, '%m/%d/%Y %H:%M:%S').to_s) unless date_string.blank?
end

在方法的早期使用return也非常Ruby。我很难习惯它来自Java背景,在那里我避免像瘟疫一样早期return

答案 2 :(得分:0)

您需要一个条件来检查date_string是否为nil。我会使用一个简单的If语句,

def local_datetime_for(date_string)
  if date_string === nil
    t = Time.strptime(date_string, '%m/%d/%Y %H:%M:%S')
    t = DateTime.parse(t.to_s)
  else
    t = 'Unknown'
  end
  return t
end

答案 3 :(得分:0)

您可以立即检查date_string值。立即返回是表达意图的最佳方式 - 并使用nil?方法以Ruby-ish方式表达您正在寻找的内容:

def local_datetime_for(date_string)
  return if date_string.nil?
  t = Time.strptime(date_string, '%m/%d/%Y %H:%M:%S') 
  DateTime.parse(t.to_s)
end

在单个"保护条款中表达退货案例"这是一种很好的做法 - 尽可能快地将边缘情况排除在外,而不是让它们像一股难闻的气味一样徘徊,徘徊在方法的肉上。

答案 4 :(得分:0)

使用File.stat而不是呼叫系统GetFileInfo。然后使用Ruby中的stat处理可能导致nil结果的任何异常。

def cdate_for(path)
  File.stat(path).ctime.to_datetime
end