繁体   English   中英

SBT对Scala类型感到困惑

[英]SBT confused about Scala types

SBT引发以下错误:

value split is not a member of (String, String)
[error]       .filter(arg => arg.split(delimiter).length >= 2)

对于以下代码块:

implicit def argsToMap(args: Array[String]): Map[String, String] = {
val delimiter = "="
args
  .filter(arg => arg.split(delimiter).length >= 2)
  .map(arg => arg.split(delimiter)(0) -> arg.split(delimiter)(1))
  .toMap
}

谁能解释这里可能会发生什么? 一些细节:

java version "1.8.0_191"
sbt version 1.2.7
scala version 2.11.8

我在命令行和intellij上都尝试过。 我也尝试了Java 11和Scala 2.11.12,但无济于事。

我无法在另一台机器上复制它(虽然是不同的OS,SBT,IntelliJ等),但我也可以写一个最小的失败案例:

value split is not a member of (String, String)
[error]     Array("a", "b").map(x => x.split("y"))

问题是filter方法是通过隐式添加到数组的。 当您调用args.filter(...)args将通过Predef.refArrayOps隐式方法转换为ArrayOps

您正在定义从Array[String]Map[(String, String)]的隐式转换。 Predef.refArrayOps式优先级高于Predef.refArrayOps ,因此可以代替。

因此args转换为Map[(String, String)] 该Map的filter方法将期望一个类型为(String, String) => Boolean的函数作为参数。

我相信发生的事情是隐式方法变得太急切了。 也就是说, Tuple2似乎无处不在,这是隐式函数将每个String转换为键/值对的结果。 隐式函数是递归地调用自身。 我最终在处理一些String的集合的其他代码导致堆栈溢出后发现了这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM