【问题标题】:can you explain this piece of Scala code?你能解释一下这段 Scala 代码吗?
【发布时间】:2023-03-26 07:45:01
【问题描述】:

有人可以帮我看看这段 scala 语法吗?我是 Java 语言的新手。

val map = Map(seq map { a => a.key -> a }: _*)

我特别了解a => a.key -> a 是一个匿名函数,它为每个a 返回一对(?)(a.key, a),但是: _*{ } 是做什么的,为什么@987654331 之间有一个空格@ 和 map?它们是 Map 构造函数的参数吗?

【问题讨论】:

标签: scala


【解决方案1】:

: _* 告诉编译器将 arr 的每个元素作为其自己的参数传递给函数,而不是将所有元素作为单个参数传递。或者换句话说it is a special instance of type ascription which tells the compiler to treat a single argument of a sequence type as a variable argument sequence, i.e. varargs

_* 类型注解包含在 SLS 的“4.6.2 Repeated Parameters”中。

参数部分的最后一个值参数可以用“*”作为后缀,例如(..., x:T *)。方法内部这种重复参数的类型就是序列类型 scala.Seq[T]。具有重复参数 T * 的方法采用可变数量的 T 类型参数。也就是说,如果将类型为 (p1 : T1, . . . , pn : Tn,ps : S*)U 的方法 m 应用于 k >= n 的参数 (e1, . . . , ek),则 m 为在该应用程序中被认为具有类型 (p1 : T1, . . . , pn : Tn,ps : S, . . . , ps0S)U,其中 k ¡ n 次出现的类型为 S,其中 ps 之外的任何参数名称都是新的。此规则的唯一例外是,如果最后一个参数通过 _* 类型注释标记为序列参数。如果将上述 m 应用于参数 (e1, . . . , en,e0 : _*),则该应用程序中 m 的类型被视为 (p1 : T1, . . . , pn : Tn,ps :scala .Seq[S])

{ }表示一个block of code,由multiple statementsdeclarations组成,其值为最后一条语句的值。如果你需要声明、多条语句、导入或类似的东西,你需要花括号

Scala 有一种特殊的punctuation-free 语法,用于调用带有一个参数的方法。一般规则是Scala methods that take a single parameter can be invoked without dots or parentheses

【讨论】:

    【解决方案2】:

    除了 Ramesh 的回答.. 你的 seq 很可能是一个 Scala 集合。 Scala 集合有许多方法,如 map、filter、fold、reduce 等。因此 map 是对 seq 的方法调用,无需使用点运算符即可调用。这在 Scala 中是允许的,前提是该方法采用单个参数。
    _* 有点奇怪。不可变映射需要一个可变参数作为参数。但是 seq 上的 map 方法会返回一个 Map。 _* 位于“类型”的位置。所谓类型,我的意思是,如果我写 i: Int,那么 Int 就是类型。因此,当对象的类型被标记为 _* 时,编译器会进行自动类型转换,该编译器使用工厂将对象转换为可变参数。和 Java 一样,可变参数只能作为参数列表中的最后一个参数出现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-12
      • 1970-01-01
      • 2015-05-12
      • 2021-04-22
      • 1970-01-01
      相关资源
      最近更新 更多