0

私はscalaに慣れていないので、そのようなばかげた質問をしてすみません。scala を使用して基本的な DSL をプログラムする方法としてを見ていました。Order クラスの vars の代わりに vals を使用して再作成できるかどうか疑問に思っていました。vals の名前を vars に変更しようとしましたが、 val を再割り当てしようとしているときに to() メソッドで複雑なエラーが発生しました。

4

2 に答える 2

3

Orderを不変にするプロセスを完了する必要があります。

これは、少なくともコンストラクターを作成して、作成時にすべてのフィールドを設定し、すべてのミューテーターを変更して、現在のオブジェクトを変更して返すのではなく、新しいオブジェクトを作成して返すことを意味します。

Orderアレックスが言ったように、これはケースクラスにすることで非常に簡潔に行うことができます。しかし、ケース クラスまではるばる行く必要はありません。これは次のようになります。

  class Order(val price: Int, val ins: Instrument, val qty: Int, val totalValue: Int, val trn: TransactionType, val account: String) {

    def to(i: Tuple3[Instrument, Int, TransactionType]): Order = {
      new Order(price, i._1, i._2, totalValue, i._3, account)
    }

    def maxUnitPrice(p: Int) = {
      new Order(p, ins, qty, totalValue, trn, account)
    }

    def using(pricing: (Int, Int) => Int) = {
      new Order(price, ins, qty, pricing(qty, price), trn, account)
    }

    def forAccount(a: String)(implicit pricing: (Int, Int) => Int) = {
      new Order(price, ins, qty, pricing(qty, price), trn, a)
    }
  }

ケース クラスの方がよい考えである可能性があります (1 つの理由として、copy メソッドを使用するとメソッドがより簡潔になります)。

また、これはもう存在しないため、これを使用するデフォルト コンストラクターへの呼び出しを置き換える必要があります。あなたができることは、ベースオブジェクトを作成することです:

  object BasicOrder extends Order(0, null, 0, 0, null, null)

次に、それをすべての呼び出しの開始点として使用します。次に例を示します。

  BasicOrder to sell(200 bondsOf "Sun")
            maxUnitPrice 300
            using {
              (qty, unit) => qty * unit - 500
于 2013-04-27T16:37:09.497 に答える
2

Orderケースクラスを作成し、メソッドを使用しcopyて、変更時に新しい不変オブジェクトを作成できます。

例:

case class Order(price: Int = 0, qty: Int = 0, totalValue: Int = 0, account: String = null) {                                                                                           
  def maxUnitPrice(p: Int) = copy(price = p)
  ...
}
于 2013-04-27T15:41:53.033 に答える