注:誰かが私が尋ねようとしているもののより良いタイトルを考え出すことができる場合は、言及するか編集してください。私はMyWrapperBound
のすべてのすべての実装は、私は私のwrap
メソッドからそれを構築し、返すことができmessage: String
を取るコンストラクタを持つべきであることを記述するための方法を探していますコンストラクタの境界?
:ラップ法を考える
。
私はこれを行うにはいくつかの方法を考えることができます。
方法1 - 暗黙的に使用して:
def wrap[T <: MyWrapperBound](message: String)(implicit factory: String => T): T
これは、任意のMyWrapperBound
IMPLことを意味します。
case class SimpleBound(message: String) extends MyWrapperBound
object SimpleBound {
implicit def factory(message: String): SimpleBound = SimpleBound(message)
}
これにより、かなりの量の定型文が生成されますが、これは避けたいものです。
方法2 - マクロ:開発者のために存在しない場合
def wrap[T <: MyWrapperBound](message: String): T = macro ...
マクロは、種類を取るのがあれば種類を構築し、有効なコンストラクタがある主張と素敵なコンパイルエラーをスローします
私の質問は、スカラには新しく、欠けている簡単なオプションはありますか?より意味のある別のオプションがありますか?
方法1と方法2は異なるものです。方法1では、暗黙的にそれを実装する方法について話し、方法2では、マクロを使用して検証を行う方法について説明します。方法2のマクロを使って型のコンストラクタを生成したいと言っていましたか? –
はい、同じ目標を達成するさまざまな方法です。メソッド2はコンストラクターが既に存在する場合にのみコンストラクターを検証して使用します。それがなければ、コンパイル時エラーを修正するためにそれを追加して追加するのは開発者次第です。 – Cheetah
@YuvalItzchakov - あなたのコメントにつながったと私が思った間違いを見ました。マクロバージョンは、暗黙的なパラメータを持つことを意図していませんでした....ごめんなさい。 – Cheetah