2017-08-04 8 views
0

私はスカラを使い慣れていません。スカラで暗黙関数を一般化する

は、私はその後、私はどちらかのか、私も持っている属性<thing>

を持っていませんでしたでしたXMLツリーを持って

implicit def stringToOption(s: String): Option[String] = if(s.isEmpty) { None } else { Some(s) }

を書かれているOption[String]Stringsをオン暗黙の機能を持っていると言います次のような暗黙の関数を使用する2つのクラス:

case class ClassA(field: Option[String]) 

object ClassA { 

    implicit val decoder(nodeSeq: NodeSeq) => 
     ClassA(field = nodeSeq \@ "thing") 
} 

そして

case class ClassB(field: Option[String]) 

object ClassB { 

    implicit val decoder(nodeSeq: NodeSeq) => 
     ClassB(field = nodeSeq \@ "thing") 
} 

は、これらの別々のクラスの両方が両方にOption[String]Stringを回すために知っているような暗黙の機能を保存する方法はありますか?

通常、私のようなクラスのいずれかにstringToOptionに固執します:

case class ClassB(field: Option[String]) 

object ClassB { 

    implicit def stringToOption(s: String): Option[String] = if(s.isempty) {None} else {Some(s)} 

    implicit val decoder(nodeSeq: NodeSeq) => 
     ClassB(field = nodeSeq \@ "thing") 
} 

しかし、私はそれが両方のクラスのために利用できるように、どこか別の場所に固執したいと私はリライトする必要はありません。それは両方でそうである。これは可能ですか?

ありがとうございます。

+0

ここで 'stringToOption'を使用しますか? –

+0

うまく説明するために質問を編集しました。ありがとう! – LivingRobot

答えて

2

暗黙の関数は、コードをフォローして間違いをより簡単にするため、悪い習慣とみなされます。現在、警告なしで使用するには言語のインポートが必要です。there is discussion to potentially heavily restrict them

それは、あなたが求めていることをすることができると言いました。 暗黙の関数をオブジェクトのどこかに定義し、必要な場所にインポートします。

object DangerousImplicits { 
    implicit def stringToOption(s: String): Option[String] = if(s.isempty) {None} else {Some(s)} 
} 

この暗黙的な変換を行う場所にこれをインポートできます。 (インポートの範囲を最小限にする方法でインポートすることをお勧めします)

import DangerousImplicits.stringToOption 
+0

将来のバージョンのScalaからの暗黙的な変換の可能性のある削除を確認するリファレンスを提供してもらえますか? – Haspemulator

+0

@Haspemulator関連するPRディスカッションへのリンクを追加しました。 – puhlen

関連する問題