[英]Scala generic type method matching
我正在構建一個Scala通用類型方法,該方法采用具有不同大小的元組並輸出一行CSV字符串。 我寫的代碼是這樣的
object CSVFormat {
protected def valueToCSV[T](value: Seq[T]): String =
s""""${value.map(_.toString).mkString("{", ",", "}")}""""
protected def valueToCSV[T](value: T): String =
s""""${value.toString}""""
def rowToCSV[A](row: (A)): String = valueToCSV(row)
def rowToCSV[A, B](row: (A, B)): String =
s"${rowToCSV((row._1))},${rowToCSV((row._2))}"
def rowToCSV[A, B, C](row: (A, B, C)): String =
s"${rowToCSV((row._1, row._2))},${rowToCSV((row._3))}"
def rowToCSV[A, B, C, D](row: (A, B, C, D)): String =
s"${rowToCSV((row._1, row._2, row._3))},${rowToCSV((row._4))}"
def rowToCSV[A, B, C, D, E](row: (A, B, C, D, E)): String =
s"${rowToCSV((row._1, row._2, row._3, row._4))},${rowToCSV((row._5))}"
}
我想要得到的是類似
CSVFormat.rowToCSV(("hello", 1234, Seq("a", "b", "c")))
那么輸出應該是
"hello","1234","{a,b,c}"
這里的主要問題是Seq[T]
類型匹配和valueToCSV
方法的T
類型匹配,似乎T類型總是贏,所以
CSVFormat.rowToCSV((Seq("A")))
總是導致
""[(List(A))]""
知道如何使Scala通用類型匹配, Seq[T]
具有更高的優先級,以便首先獲得匹配嗎? 還是應該在運行時確定類型而不是編譯類型? 如果是這樣,我該怎么辦?
當不知道您傳入的類型是否為序列時,將在編譯時解析valueToCSV
方法的風格。
您需要動態類型檢查。 這樣的事情怎么樣:
def rowToCSV[T <: Product](tuple: T) = tuple
.productIterator
.map {
case s: Seq[_] => s.mkString("{", ",", "}")
case x => x.toString
}.mkString("\"", "\",\"", "\"")
順便說一句,調用一個函數(其唯一的參數是元組)時不需要括號: rowToCSV("foo")
與rowToCSV(("foo"))
和rowToCSV(1, "foo", Seq("bar", "baz"))
與rowToCSV((1, "foo", Seq("bar", "baz")))
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.