Ruby语法:如何编写“a = h [:v] if!h [:v] .nil?”

时间:2010-09-17 11:30:17

标签: ruby-on-rails ruby

我发现自己经常写的语句相当于:

deleted_at = Time.at(data[:deleted_at]) if !data[:deleted_at].nil?

我希望能够以更简洁的方式写出来。有什么建议吗?

有时我把它写成:

deleted_at = Time.at(i) if !(i = data[:deleted_at]).nil?

但我认为这会使代码难以阅读,所以我希望有更好的方法来做到这一点。

7 个答案:

答案 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(我不推荐这个!)