0

我正在尝试减少以下 if/else 语句...

event_description = "We have a record of item FJ750701138GB as being delivered from Northampton North DO on 2013-08-10."
time = Time.now.strftime("%H:%M")

if date = event_description.scan(/We have a record of item [^>]* as being delivered from [^>]* on ([^<]*)./i).join
  datetime = Date.strptime("#{date} #{time}","%Y-%m-%d %H:%M").to_time
elsif date = event_description.scan(/Your item with reference [^>]* was delivered from our [^>]* Delivery Office on ([^<]*) ./i).join
  datetime = Date.strptime("#{date} #{time}","%d/%m/%y %H:%M").to_time
elsif date = event_description.scan(/Item [^>]* was collected and signed for by the addressee on the ([^<]*) from [^>]*/i).join
  datetime = Date.strptime("#{date} #{time}","%Y-%m-%d %H:%M").to_time
elsif date = event_description.scan(/Your item, posted on [^>]* with reference [^>]* was delivered in [^>]* on ([^<]*)./i).join
  datetime = Date.strptime("#{date} #{time}","%d/%m/%y %H:%M").to_time
end

event.occurred_at = datetime

它的主要功能是扫描各种字符串,从中提取日期,并创建一个 Date 对象。

  • 日期可以采用不同的格式(如您在striptime实例中所见)
  • 随着时间的推移,当我们扩展我们正在扫描的字符串时,我们将添加更多elsif语句,因此希望将其压缩一点,使其不那么庞大。

有相当数量的代码重复,所以试图弄清楚如何重构它。

4

2 回答 2

1

我相信最好的选择是解析你想要的日期和时间格式的行。

像这样的东西。

case description
when /(\d{4})-(\d{2})-(\d{2})/
  puts year  = $1
  puts month = $2
  puts day   = $3
when /(\d{2})\/(\d{2})\/(\d{2})/
  puts day   = $1
  puts month = $2
  puts year  = $3
else
  puts "Unknown Date/Time"
end

然后使用变量转换为您的时间。

于 2013-08-21T14:17:40.267 回答
0

String#scan将返回一个数组,join对结果执行操作将给出一个字符串,因此代码中的第一个条件将始终满足

如果这是故意的,您可以删除其他条件,您的代码可以重构为:

event_description = "We have a record of item FJ750701138GB as being delivered from Northampton North DO on 2013-08-10."
date = event_description.scan(/We have a record of item [^>]* as being delivered from [^>]* on ([^<]*)./i).join
time = Time.now.strftime("%H:%M")
datetime = Date.strptime("#{date} #{time}","%Y-%m-%d %H:%M").to_time
event.occurred_at = datetime
于 2013-08-21T13:51:09.247 回答