Ruby on rails Ruby:返回值还是nil
我在Rails中有这个方法,当传入参数Ruby on rails Ruby:返回值还是nil,ruby-on-rails,ruby,return-value,null,Ruby On Rails,Ruby,Return Value,Null,我在Rails中有这个方法,当传入参数date\u 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!
date\u 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
假设Model.create(creation\u date:return\u value\u此处)
可以处理nil值,则可以从此处返回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
我认为惯用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
也是非常有用的。我只是很难适应来自Java的背景,在那里我避免了早期的返回s,就像瘟疫一样。你可以使用.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
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
.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
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?
正好相反)您可以立即检查日期字符串值。立即返回是表达您的意图的最佳方式–并使用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
在一个“guard子句”中表示返回案例是一种很好的做法——它可以尽快消除边缘案例的影响,而不是让它们像臭味一样挂在方法的肉上。使用,而不是向系统调用GetFileInfo
。然后用Ruby中的stat
处理任何可能导致nil
结果的异常
def cdate_for(path)
File.stat(path).ctime.to_datetime
end
添加了一些其他方法来说明调用链。尽量避免在if
语句中包装内容。感觉不是很“Rails-y”。。。“也许我想得太多了……”Yoshiji先生用return nil if的回答看起来可能有点“红润”。此外,我知道上面的代码只是一个示例,但如果它是代码的副本,我建议包含“return”s