В Smalltalk существует метод ifNotNilDo:
Он используется следующим образом:
database getUser ifNotNilDo: [:user | Mail sendTo: user ]
В объектах, которые не являются nil
, выполняется блок, передавая сам объект в качестве параметра. Реализация в классе UndefinedObject
(эквивалент Smalltalk Ruby NilClass
) просто ничего не делает. Таким образом, если получение пользователя привело к объекту nil
, ничего не произойдет.
Мне не известно о чем-то подобном для Ruby, поэтому я выкатил свое решение. Это происходит следующим образом:
class Object
def not_nil
yield(self)
end
end
class NilClass
def not_nil
# do nothing
end
end
Его можно использовать следующим образом:
users = {:peter => "[email protected]", :roger => "[email protected]" }
users[:roger].not_nil {|u| Mail.send(u) }
Это избавляет нас от доступа к хешу дважды
Mail.send(users[:roger]) if users[:roger]
... или используя временную переменную:
u = users[:roger]
Mail.send(u) if u
Обновление:
Люди начинают предлагать решения, основанные на хеш-операциях, а также доступ к хэшу дважды. Мой вопрос не связан непосредственно с хешем.
Представьте себе, что первая операция не является хеш-доступом, а также дорогой. Как:
RemoteUserRepo.find_user(:roger).not_nil {|u| Mail.send(u) }
(с истекшим обновление)
Мои вопросы:
- Неправильно ли я изобретать эту идиому?
- Есть ли что-то вроде этого (или лучше), которое поддерживается в Ruby из коробки?
- Или есть другой, более короткий, более элегантный способ сделать это?