代码段来自Scala REPL。
这是完全合法的Scala,即使它不是很有用:
scala> class Test {
private val xs = scala.collection.mutable.ArrayBuffer[Int]()
private val func = Some((x: Int)=>{
})
private var opt: Option[(Int)=>Unit] = None
opt = func
}
defined class Test
但是,如果我尝试在func
内部执行某些操作,则代码将无法编译:
scala> class Test {
private val xs = scala.collection.mutable.ArrayBuffer[Int]()
private val func = Some((x: Int)=>{
xs += x
})
private var opt: Option[(Int)=>Unit] = None
opt = func
}
<console>:13: error: type mismatch;
found : Some[Int => Test.this.xs.type]
required: Option[Int => Unit]
opt = func
^
相反,它会产生类型不匹配错误,并列出找到和需要的类型。虽然此错误消息很有用,但我不知道如何解决它。我的下一次尝试是这样的:
scala> class Test {
private val xs = scala.collection.mutable.ArrayBuffer[Int]()
private val func = Some((x: Int)=>{
xs += x
Unit
})
private var opt: Option[(Int)=>Unit] = None
opt = func
}
<console>:14: error: type mismatch;
found : Some[Int => Unit.type]
required: Option[Int => Unit]
opt = func
^
我知道存在类型不匹配,但我不明白为什么存在类型不匹配或如何以func
在{{1}}内做一些有用的方式修复它。
为什么会出现类型不匹配以及如何解决?
答案 0 :(得分:3)
函数内部选项使用可变数组缓冲区并将其作为结果返回,但是你需要Unit,你可以这样做:
private val func = Some((x: Int)=> {xs += x; ()})
或使用返回类型为Unit的附加
private val func = Some((x: Int) => xs.append(x))