我正在学习Scala申请和更高阶的功能。我有这个编码,但为什么编译器给了我一个错误:"缺少参数类型",如何修复它?
import scala.collection.mutable.ListBuffer
object MyArr {
var mList1 = ListBuffer[Int]()
def filter(p: Int => Boolean): List[Int] = {
val mList = List[Int]()
for (x <- mList1) {
if (p(x)) x :: mList
}
mList
}
def apply(x: Array[Int]) = {
for (y <- x) mList1 += y
}
}
def isEven(x: Int): Boolean = {
x % 2 == 0
}
var mCustomArr = MyArr(Array(1, 2, 3, 4))
mCustomArr.filter(x => isEven(x)).foreach(println)
如果apply方法只接受一个参数并将其添加到mList1,它将起作用。为什么?
感谢
答案 0 :(得分:0)
在apply方法中,它更新Object中的mList1并返回Unit。所以变量mCustomArr将是单元类型。
如果您想使用过滤方法,则需要像object MyArr {
var mList1 = ListBuffer[Int]()
def filter(p: Int => Boolean): ListBuffer[Int] = {
val mList = ListBuffer[Int]()
for (x <- mList1) {
if (p(x)) mList += x
}
mList
}
def apply(x: Array[Int]) = {
for (y <- x) mList1 += y
}
}
一样使用MyArr对象。
但是当我研究你的filter方法的实现时,它看起来像mList里面的方法永远不会改变。我认为过滤方法可以像
一样实现{{1}}
希望您乐意学习Scala,干杯。
答案 1 :(得分:0)
如果您已将返回类型添加到apply()
定义,则编译器会准确指出错误的位置。
def apply(x: Array[Int]): ListBuffer[Int] = {
for (y <- x) mList1 += y
mList1
}