0

iはデータのパラメータ化タイプを保持するデータ構造を持っているとしましょう:クラス引数プレースホルダ(または入力変数)を使用して、Scalaの

case class Terminal[A](value: A, name: String ="") 

私は一定のマテリアライズドそれを渡すと、私は簡単にTerminal[Double]を作成することができます:

val terminal = Terminal(2.0) 

はしかし、私はまた、私は別の文脈で、端末を複数回評価することができるように(マテリアライズではない)inputを受信できるようにしたいです。このプログラムのユーザーが素敵ではありませんvar input_x = Noneのようなもの、とinputを初期化して、その状態を変更する必要がありますしかし、私はこれで、すなわち

class Terminal[A](value: => A, name: String ="") { 
    def getValue = this.value 
} 

var x = 1.0 

val terminal = new Terminal(x) 

terminal.getValue // 1.0 

x = 100.0 

terminal.getValue // 100.0 

、名前でvalueを呼び出すことによって、シンプルなソリューションを実現することができますターンは私にvalueOption[A]

にする必要がありますこの状況に対処するための最良の方法ですか?私が使用できるデザインパターンやスケーラ機能はありませんか?

これらのコンテキスト依存入力を表すクラスInputを作成することもできますが、多くの変更が必要になります。

+0

問題に特定の解決策を適用しようとして問題が発生しているようです。問題は、ソリューションを実装するための助けを求めることです。これは間違いがほとんどありませんが、解決しようとしている実際の問題は決して記述しません。私はあなたが一歩踏み出し、この「ターミナル」クラスが必要な理由(あなたが思う)と、それを実生活でどのように使うのか想像してみることをお勧めします。 – Dima

答えて

1

あなたは以下のように不変オブジェクトを使用することができますゲッターはcase classesと自由に来るので

scala> case class Terminal[A](value: A, name: String ="") { 
    | def update(newValue: A): Terminal[A] = this.copy(value = newValue) 
    | def getValue: A = this.value 
    | } 
defined class Terminal 

scala> val terminal = Terminal(1.0) 
terminal: Terminal[Double] = Terminal(1.0,) 

scala> val updatedTerminal = terminal.update(100.0) 
updatedTerminal: Terminal[Double] = Terminal(100.0,) 

scala> val oldValue = terminal.getValue 
oldValue: Double = 1.0 

scala> val newValue = updatedTerminal.getValue 
newValue: Double = 100.0 

getValueメソッドは、ここでは、実際には冗長です。私は例を示すためにそれをそこに持っていただけです。一般的に

scala> oldValue == terminal.value 
res0: Boolean = true 

scala> newValue == updatedTerminal.value 
res1: Boolean = true 

、あなたは(たとえば、すべてのシングルトンのコンポーネントは、より良いオフ非ケースクラスとしてある)可変状態を持たないオブジェクトを作成する場合は、ケースのクラスを好みます。

関連する問題