Подтвердить что ты не робот

Scala Возвращение функции void с 0 параметрами, уродливым синтаксисом?

Учитывая метод, определенный следующим образом:

 def descendEach(times:Int)(f:()=>Unit) {
      for (i <- 1 to times) {
          // other code
          f()
      }
   }

когда я использую этот метод, я хочу иметь возможность писать

 gd.descendEach(20){
    println(gd.cost)
 }

но компилятор scala позволяет мне уйти с

  gd.descendEach(20){ () => 
    println(gd.cost)
 }

что является своего рода уродливым. Я что-то упустил? Можно ли записать его первым способом, который я представил?

4b9b3361

Ответ 1

Используйте следующий синтаксис:

def descendEach[T](times:Int)(f: => T)

Таким образом, вы можете не только передавать функцию без дополнительных () => (это называется pass by name), но также использовать функции, возвращающие любой тип (не обязательно Unit). Иногда удобно, когда у вас есть существующая функция, которую вы хотите передать, но на самом деле не заботитесь о ее возвращаемом значении:

def g() = 42
descendEach(20)(g)

Обратите внимание, что с помощью этого синтаксиса вы просто используете f, а не f().