Лучший синтаксис для анонимной функции Scala? - PullRequest
2 голосов
/ 30 октября 2009

Экспериментируя со Scala ... Я пытаюсь определить что-то аналогичное взлому "@" в PHP (что означает, игнорировать любое исключение в следующем выражении).

Мне удалось получить определение, которое работает:

    def ignoreException(f: () => Unit) = {
      try {
        f();
      }
      catch {
        case e: Exception => println("exception ignored: " + e);
      }
    }

И используйте это так:

ignoreException( () => { someExceptionThrowingCodeHere() } );

Теперь вот мой вопрос ... Могу ли я в любом случае упростить использование и избавиться от () => и, возможно, даже от скобок?

В конечном итоге я бы хотел, чтобы использование было примерно таким:

`@` { someExceptionThrowingCodeHere(); }

Ответы [ 2 ]

12 голосов
/ 30 октября 2009

@ зарезервировано в Scala (для сопоставления с образцом), но вы бы приняли @@?

scala> def @@(block: => Unit): Unit = try {
  block
} catch {
  case e => printf("Exception ignored: %s%n", e)
}   
$at$at: (=> Unit)Unit

scala> @@ {
  println("before exception")
  throw new RuntimeException()
  println("after exception")
}
before exception
Exception ignored: java.lang.RuntimeException

Я не уверен, что это хорошая идея, однако 100

6 голосов
/ 30 октября 2009

Вам не нужно использовать функцию в качестве параметра, параметр «по имени» подойдет:

def ignoreException(f: =>Unit) = {
  try {
    f
  }
  catch {
    case e: Exception => println("exception ignored: " + e)
  }
}

ignoreException(someExceptionThrowingCodeHere())

Эрик.

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