0

我是 scala 的新手,所以请原谅我问了这么愚蠢的问题。正在查看如何使用 scala 编写基本 DSL的示例。想知道是否可以在 Order 类中使用 vals 而不是 vars 重新创建它。我尝试将 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)
    }
  }

案例类可能是一个更好的主意(一方面,复制方法会使方法更简洁)——这只是为了展示一个替代方案。

您还需要在使用 this 时替换对默认构造函数的调用,因为它不再存在。您可能会做的是创建一个基础对象:

  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 回答