Learning Scala 参考Scala for Data Science一书和配套的Github repo,这里我特别说一下这个函数,复制如下供参考
def fromList[T: ClassTag](index: Int, converter: String => T): DenseVector[T] =
DenseVector.tabulate(lines.size) { row => converter(splitLines(row)(index)) }
DenseVector.tabulate(lines.size)
符号和函数体定义之间的=
是什么意思? scala 的新手(具有 python 和 C++ 的背景),所以无法确定 DenseVector.tabulate(lines.size)
是被定义函数的局部变量(何时应该在定义中声明)还是其他什么?根据我对 scala 语法的理解,它不能是返回类型。
此外,
ClassTag
是否等同于 C++ 中的模板?
帮你回答问题,
splitLines
有类型scala.collection.immutable.Vector[Array[String]]
lines.size
是一个 unsigned int(很明显,但还是很清楚)你的例子使用了几个语法糖。
相当于以下内容,开始时可能更容易阅读:
def fromList[T](index: Int, converter: String => T)(implicit classtag: ClassTag[T]): DenseVector[T] = {
def rowConverter(row: ???): ??? = {
converter(splitLines(row)(index))
}
DenseVector.tabulate(lines.size)(row => rowConverter(row))
}
注意:
tabulate
是一种采用两组参数的方法tabulate
的第二组参数是单个参数,是一个“lambda”函数ClassTag
东西被称为“上下文绑定”,这是一种表示该方法需要用其他类型参数化的给定类型的隐式值的方式。 Classtag
本身是一种在运行时保留类型信息的方法(由于“JVM 中的类型擦除”,这些信息将丢失)。