2017-10-04 6 views
0

Mapの値の型をScalaのAnyからStringに変換しようとしています。Map - Scalaの値の型を変換する

私はだから私は基本的に[文字列、文字列]をマップするために地図[文字列、任意]からの戻り値の型を変換するために、CanBuilderFormをこの

import scala.collection.generic.CanBuildFrom 


case class Name(FristName: String,LastName: String) 

object App29 extends App { 


    val name = Name("mark","aden") 


    val stringListBuilder = new CanBuildFrom[List[Any], String, List[String]] { def apply(from: List[Any]) = this.apply(); def apply() = List.newBuilder[String] } 

    val result = name.getClass.getDeclaredFields.map(_.getName) 
    .zip(name.productIterator.toList)(stringListBuilder).toMap 


} 

のようなコードを使用していましたが、それは投げ、なぜ私は理解していない

タイプミスマッチエラーです。

おかげ

編集-1

は、私は、文字列に変換しname.productIterator.map(_。のtoString)を使用することができることを考え出したが、私は私のCanBuildFromの構文が間違っている理由を知りたいですそしてどうやって。

+0

この[Scala-lang blog](https://www.scala-lang.org/blog/2017/05/30/tribulations-canbuildfrom.html)が興味深いかもしれません。本質的に、Scalaは、進行中の言語デザインで 'CanBuildFrom'の使用をやめようとしています。 –

答えて

2

これは、CanBuildFromが使用するために設計されたものではありません。 CanBuildFromは、新しいコレクションタイプの実装を容易にするように設計されています。これはmapのようなメソッドがGenTraversableLikeという形で定義され、およびVectorなどの各サブタイプでオーバーライドするのではなく、特定のコレクションのタイプを返すことができることを意味します。特定のコレクションにCanBuildFromビルダーを使用するためです。一般的な操作を行うことができます。

上記のようにCanBuildFromを使用すると、あなたのコードを読んだ人はまったく混乱するでしょう。慣用ではありません。避けてください。CanBuildFromがこのように使われているとすれば、あなたが達成しようとしていることを正確に説明していない場合、別の方法でそれを行う方法の例を示した場合、コンパイルと作業を行っても、コードが何をしているのかは分かりません。実際に何をしているのか、そして再利用可能な機能を提供したいユーティリティライブラリやフレームワークだけが深いところであれば、アプリケーションコードにはほとんど現れないはずですが、一般的にはCanBuildFromインスタンスで再生するべきです。私のScala開発の6年間で、自分でCanBuildFromを実装する必要は一度もありませんでした。実際にはCanBuildFromインスタンスで何かを行うコードが2回しか書かれていません。

コードがコンパイルされない理由は、zipにはCanBuildFromが必要です。その2番目のパラメータは元のコレクションのタイプのタプルであり、渡すコレクションのタイプです。つまり、 a CanBuildFrom[List[Any], (String, Any), List[(String, String)]]

関連する問題