Синтаксис Ruby: Как написать «a = h [: v] if! H [: v] .nil?» - PullRequest
1 голос
/ 17 сентября 2010

Я часто пишу заявления, эквивалентные:

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

Я бы хотел написать это более кратко. Есть предложения?

Иногда я пишу это как:

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

Но я думаю, что это затрудняет чтение кода, поэтому я надеюсь, что есть более хороший способ сделать это.

Ответы [ 7 ]

4 голосов
/ 17 сентября 2010

Я использую слово «если», так как считаю его более читабельным:

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

или вы можете даже использовать:

deleted_at = Time.at(data[:deleted_at]) if data[:deleted_at]
1 голос
/ 17 сентября 2010
data_deleted = data[:deleted_at]
deleted_at = Time.at(data_deleted) unless data_deleted.nil?

делает его более читабельным IMO.

1 голос
/ 17 сентября 2010

Вы можете обернуть это в целом в лямбда-блок:

class Object
  def unless_nil?
    yield self unless self.nil?
  end
end

data[:deleted_at].unless_nil? {|i| deleted_at = i }

Я бы порекомендовал не вносить обезьяны исправления в класс Object, но лучше создать модуль и включить его в классы, которые нуждаются в этой функциональности.для.

0 голосов
/ 23 сентября 2010

Если только Time.at доставляет вам проблемы, вы можете написать

class Time
  def nil_friendly_at(time)
    return nil if time.nil? # Or "unless time"
    at(time)
  end
end

Или вы можете сделать обезьянку-патч Time.at, если хотите (хотя я не рекомендую это!)1006 *

0 голосов
/ 17 сентября 2010

Вы можете воспользоваться нулевой версией, оценивающей значение false, чтобы сделать это:

deleted_at = data[:deleted_at] and Time.at(data[:deleted_at])

Хотя сейчас, написав это, я думаю, что предпочитаю версию if.

Код написан гораздо меньше, чем читаемый - краткий не всегда равен читаемому.

0 голосов
/ 17 сентября 2010

Не иметь deleted_at объявленного таким образом - это не моя чашка чая.По крайней мере, он будет установлен в ноль с чем-то вроде этого:

deleted_at = Time.at(data[:deleted_at]) rescue nil

или

deleted_at = data[:deleted_at].nil? ? nil : Time.at(data[:deleted_at])
0 голосов
/ 17 сентября 2010

Вы также можете сделать

data[:deleted_at] and deleted_at = Time.at(data[:deleted_at])

хотя лучше ли это вопрос вкуса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...