我发现自己经常写的语句相当于:
deleted_at = Time.at(data[:deleted_at]) if !data[:deleted_at].nil?
我希望能够以更简洁的方式写出来。有什么建议吗?
有时我把它写成:
deleted_at = Time.at(i) if !(i = data[:deleted_at]).nil?
但我认为这会使代码难以阅读,所以我希望有更好的方法来做到这一点。
答案 0 :(得分:4)
我使用'除非',因为我觉得它更具可读性:
deleted_at = Time.at(data[:deleted_at]) unless data[:deleted_at].nil?
或者您甚至可以使用:
deleted_at = Time.at(data[:deleted_at]) if data[:deleted_at]
答案 1 :(得分:1)
你可以将它通常包装成lambda块:
class Object
def unless_nil?
yield self unless self.nil?
end
end
data[:deleted_at].unless_nil? {|i| deleted_at = i }
我建议不要修补Object
类,但最好创建一个模块,并将其包含在您需要此功能的类中。
答案 2 :(得分:1)
data_deleted = data[:deleted_at]
deleted_at = Time.at(data_deleted) unless data_deleted.nil?
使IMO更具可读性。
答案 3 :(得分:0)
您也可以
data[:deleted_at] and deleted_at = Time.at(data[:deleted_at])
虽然这更好是一个品味问题。
答案 4 :(得分:0)
没有deleted_at
宣布这不是我的一杯茶。至少可以用这样的东西设置为零:
deleted_at = Time.at(data[:deleted_at]) rescue nil
或
deleted_at = data[:deleted_at].nil? ? nil : Time.at(data[:deleted_at])
答案 5 :(得分:0)
您可以利用评估为false的nil版本来执行此操作:
deleted_at = data[:deleted_at] and Time.at(data[:deleted_at])
虽然现在已经写了这个,我想我更喜欢if
版本。
编写的代码远远少于其读取 - 简洁并不总是等同于可读。
答案 6 :(得分:0)
如果只有Time.at
给你带来问题,你可以写
class Time
def nil_friendly_at(time)
return nil if time.nil? # Or "unless time"
at(time)
end
end
或者如果你愿意的话,你可以自己修补Time.at
(我不推荐这个!)