![](/img/trans.png)
[英]Running an SBT Command Line Application gets confused about Scala Version
[英]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.