3

ケース・クラスを使用して Scala でプログラムを作成していると、後で参照できるように、ケース・クラスの作成者をパラメータとして入れたいというパターンに繰り返し遭遇しました。ケースクラスに暗黙の値を設定することで、このパターンを捉えることができることを学びました

abstract class MessageCreator
case class SomeMessage(s:String)(implicit val creator:MessageCreator)
class MyCreator extends MessageCreator { implicit val creator = this}
class ACreator extends MyCreator { def newMessage = SomeMessage("hello") }

次に、ここの newMessage にcreatorは、ACreator 自体のインスタンスを参照するメンバーが含まれます。

今、同じことをするケースクラスがたくさんあります。(implicit val creator:MessageCreator)私の質問は、そのようなケース クラスを定義するたびにコピー アンド ペーストせずに、このパターンをどのように繰り返すかということです。

暗黙の val を使用して抽象クラスを定義し、ケース クラスから継承しようとしましたが、Scala は、抽象クラスの暗黙の val がケース クラスで定義されていないと不平を言っていました。明らかに、case クラスは継承できません。

これがプログラムで実行できない場合は、マクロの作成を検討し始めるかもしれません (これは優れた解決策です)。ここで何も見逃していないことを確認したいと思います。

4

1 に答える 1

1

ドメインについて詳しく知らなくても、次のような質問をします。

  1. 工場をコンパニオン オブジェクトにできないのはなぜですか。ケースクラスの場合、これは言語とコンパイラのためにすでに明示的にそうです。別のものが必要な場合は、適用をオーバーロードします。

  2. あなたのクラスは、なぜ自分自身をもっと創造する能力を必要としているのでしょうか? それは部分的に「コピー」の目的ではありませんか(部分的とは、すべてのフィールドが置き換えられていないことを意味します)。

私がこれらの質問をする季節は、コンテキストがなければ、あまりメリットがなく、追加の複雑さを導入したように聞こえるということです。

最後に、暗黙的に状態を渡している場合は、それに対して警告します。これは、あらゆる種類の問題や問題につながる可能性があります。バグを引き起こさない限り、暗示は素晴らしいものです。バグが発生すると、そのバグを解読して追跡することが難しくなります。型クラスには暗黙的のみを使用する必要があると言うところまで行きます

于 2013-06-05T11:41:22.997 に答える