Получение "ошибка: несоответствие типов; найдено: Требуется блок: () => Блок" при обратном вызове - PullRequest
3 голосов
/ 27 сентября 2011

Я только начинаю проходить урок по scala и попал в блок.Я объединил пару примеров и получаю ошибку, но не знаю почему.

import java.text.DateFormat._
import java.util.{Date, Locale}

object FrenchDate {
  def main(args: Array[String]) {
    timer(println(frenchDate))
  }

  def frenchDate():String = {
    val now = new Date
    val df = getDateInstance(LONG, Locale.FRANCE)
    df format now
  }

  def timer(callback: () => Unit) {
    while(true) {callback(); Thread sleep 1000}
  }
}

Приносит ошибку

error: type mismatch;
found   : Unit
required: () => Unit
println(frenchDate)

, в то время как ниже работает

import java.text.DateFormat._
import java.util.{Date, Locale}

object FrenchDate {
  def main(args: Array[String]) {
    timer(frenchDate)
  }

  def frenchDate() {
    val now = new Date
    val df = getDateInstance(LONG, Locale.FRANCE)
    println(df format now)
  }

  def timer(callback: () => Unit) {
    while(true) {callback(); Thread sleep 1000}
  }
}

Единственное отличие состоит в том, что дата печатается в frenchDate() во второй раз, тогда как она возвращается и печатается в обратном вызове на первой.

1 Ответ

6 голосов
/ 27 сентября 2011

Разница в том, что эта строка:

timer(println(frenchDate))

пытается вызвать println(frenchDate) и использовать возвращаемое значение (равное Unit) в качестве обратного вызова для передачи на timer.Вы, вероятно, хотите:

timer(() => println(frenchDate))

или, возможно,

timer(() => { println(frenchDate) })

(я не разработчик Scala, поэтому я не уверен в правильном синтаксисе, но я довольно уверено том, что не так в вашем текущем коде:)

РЕДАКТИРОВАТЬ: Согласно комментариям, это тоже должно работать и может быть более идиоматическим:

timer { () => println(frenchDate) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...