Вызов анонимного закрытия - PullRequest
3 голосов
/ 29 января 2012

Редактировать
хорошо, отличная обратная связь, направила меня в правильном направлении. Вариант использования для вызова анонимного закрытия находится в слое маршрутизации Scalatra. У меня есть несколько маршрутов, сгруппированных по разным типам, в этом примере запросы, общие для команд:

class Router {
  type TeamType <: _Controller with _Team

  get("""(schedules|rosters|teamresults|teamstats)/\d{8}""".r) {
    val clazz :: date = captures

    val obj = (clazz match {
      case "schedules" => new RosterController
      case "rosters" => new ScheduleController
    }).asInstanceOf[TeamType]

    obj.show(date)
  }
}

Оборачивая выражение соответствия в самовозглашаемое анонимное закрытие, мы избегаем привязки «FooController.asInstanceOf [TeamType]» к каждому сопоставленному случаю и вместо этого выполняем приведение типа к возвращаемому экземпляру, поддерживая неизменность в процессе (т.е. не удалось "val obj = clazz match {...}" с последующим приведением типа, поскольку obj уже был val'd)

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

Во всяком случае, классные вещи, не хватало анонимных закрытий в Groovy, и теперь я обнаружил, что в Scala это тоже есть; -)

Оригинал
Не уверен, как осуществить это в Scala. В Groovy вы можете определить и вызвать анонимное закрытие следующим образом:

{String s-> println(s) }("hello")

Что такое эквивалент в Scala? Кроме того, вместо того, чтобы возвращать Unit, как можно указать тип возвращаемого значения?

Спасибо

Ответы [ 2 ]

7 голосов
/ 29 января 2012
((s : String) => println(s))("hello")

Что касается типа возвращаемого значения, просто дайте Scala сделать вывод.

scala> ((x : Int) => x < 4)(3)
res0: Boolean = true
1 голос
/ 29 января 2012

Чтобы добавить ответ @ larsmans, вы также можете использовать типы аргументов для компилятора Scala.Вывод типа Scala течет слева направо, поэтому вы должны расположить термины соответствующим образом.Мы можем сделать это, определив оператор прямого канала, |>, такой, что:

x |> f = f(x)

Он доступен в Scalaz.Если вы не хотите использовать Scalaz, нетрудно определить его самостоятельно .

Пример использования:

scala> "hello" |> { s => println(s) }
hello

scala> "hello" |> println
hello

scala> 3 |> { y => y < 4 }
res23: Boolean = true

scala> 3 |> { _ < 4 }
res24: Boolean = true
...