Предположим, я хочу обернуть код, который может генерировать исключения с помощью блока try-catch, который регистрирует исключение и продолжает. Что-то вроде:Можно ли передать «это» как неявный параметр в Scala?
loggingExceptions {
// something dangerous
}
В идеале, я хотел бы использовать для входа в Logger, определенный на вызывающий объект, если таковой имеется (и если нет, не получаю ошибку во время компиляции). Я хотел бы, чтобы определить что-то вроде этого:
def loggingExceptions[L <: { def logger: Logger }](work: => Unit)(implicit objectWithLogger: L): Unit = {
try {
work
} catch {
case t: Exception => objectWithLogger.logger.error(t.getMessage)
}
}
где objectWithLogger бы как-то «волшебным образом» расширить до «этого» в код клиента. Возможно ли это (или подобное)?
Спасибо, это работает! Но есть ли другие решения, которые не связаны с изменением объявления всех классов, которые хотят использовать loggingExceptions (...)? – 2010-11-24 19:23:55
@JPP Нет, по крайней мере, у callsite должен быть неявный объект ожидаемого типа в области видимости. Например, вы можете сделать неявный параметр `Logger` и изменить` def logger` на `implicit def logger` в вызывающем объекте. Тем не менее, импликации следует избегать, если это необходимо, и черта подходит для этой проблемы. – 2010-11-24 19:47:25