Scala 获得;错误:类型不匹配;找到:所需单位:()=>;单位「;回拨
我刚开始学习scala教程,遇到了一个障碍。我合并了几个例子,发现了一个错误,但不知道为什么Scala 获得;错误:类型不匹配;找到:所需单位:()=>;单位「;回拨,scala,types,callback,Scala,Types,Callback,我刚开始学习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 Da
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}
}
}
唯一的区别是,日期在第二行中打印一次,而在第一行中返回并在回调中打印。区别在于这一行:
timer(println(frenchDate))
正在尝试调用println(法语)
,并使用返回值(即Unit
)作为传递给计时器的回调。您可能想要:
timer(() => println(frenchDate))
或者可能
timer(() => { println(frenchDate) })
(我不是Scala开发人员,所以我不确定语法是否正确,但我对当前代码中的错误非常有信心:)
编辑:根据评论,这也应该有效,而且可能更为惯用:
timer { () => println(frenchDate) }
两者都应该可以工作(尽管我将它写成timer{()=>println(frenchDate)}
),您也可以将它声明为def timer(callback:=>Unit)={…callback;…},并使用timer(println(frenchDate))(或timer{println(frenchDate)},以您更喜欢的方式)调用,最后按照didierd在这里的评论进行了。