提问者:小点点

SparkSQL的SQLContext.scala中的Scala: (_)


<code>Spark</code>版本为1.3.0。

来自< code > sqlcontext . Scala (https://github . com/Apache/spark/blob/master/SQL/core/src/main/Scala/org/Apache/spark/SQL/sqlcontext . Scala)的源代码:

 @transient
  protected[sql] val ddlParser = new DDLParser(sqlParser.apply(_))

  @transient
  protected[sql] val sqlParser = {
    val fallback = new catalyst.SqlParser
    new SparkSQLParser(fallback(_))
  }

  protected[sql] def parseSql(sql: String): LogicalPlan = {
    ddlParser(sql, false).getOrElse(sqlParser(sql))
  }

我真的不能理解上面的代码。

  • sqlParser.apply(_)是如何工作的?

(_) 在地球上是什么?DDLParser 的构造函数需要一个参数解析查询:字符串 =

  • 同样,回退(_)也是应用调用,(_)是如何工作的?

共1个答案

匿名用户

在这种情况下,下划线表示部分函数应用程序,这是将方法类型转换为函数类型的一种方式。所以当您编写< code>sqlParser.apply(_)时,它等效于< code>x =

这里有很多选择。在大多数情况下,以下内容相当:

new DDLParser(x => sqlParser.apply(x))
new DDLParser(x => sqlParser(x))
new DDLParser(sqlParser.apply(_))
new DDLParser(sqlParser.apply _)
new DDLParser(sqlParser(_))
new DDLParser(sqlParser _)
new DDLParser(sqlParser.apply)
new DDLParser(sqlParser)

你可以在这里阅读更多关于方法类型和函数类型的区别。

将方法类型转换为函数类型的另一种密切相关的方法称为 eta 扩展,它在某些上下文中可互换使用。在这里阅读有关部分函数应用,eta扩展以及Scala中下划线的所有其他用法的信息。