簡體   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