在 Scala 函数之前定义的变量是什么意思?

问题描述 投票:0回答:1

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(很明显,但还是很清楚)
scala object templates
1个回答
0
投票

你的例子使用了几个语法糖。

相当于以下内容,开始时可能更容易阅读:

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 中的类型擦除”,这些信息将丢失)。
© www.soinside.com 2019 - 2024. All rights reserved.