簡體   English   中英

Scala通用類型方法匹配

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM