2013-04-27 88 views
0

我是新来的斯卡拉,所以请问这样一个愚蠢的问题。看着example如何使用scala编程基本的DSL。 想知道是否可以在Order类中使用vals而不是vars来重新创建它。 我尝试将val重命名为vars,但在to()方法中出现并发症错误,因为我正尝试重新分配val。如何在不使用变量的情况下编程scala DSL?

+2

回报与变化的新对象,而不是突变的的老,你就完成了。 – sschaef 2013-04-27 15:35:06

回答

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) 
    ... 
} 
3

您需要完成使您Order一个不变的过程。

这意味着至少要创建一个构造函数,以便您可以在创建时设置所有的字段,并更改所有的mutators来创建并返回一个新对象,而不是改变和返回当前对象。

正如Alex所说,通过将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) 
    } 
    } 

的情况下类可能是一个更好的主意(一两件事,复制方法将使方法更简洁) - 这只是表明一种替代。

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

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

,然后使用在所有通话的出发点,例如:

BasicOrder to sell(200 bondsOf "Sun") 
      maxUnitPrice 300 
      using { 
       (qty, unit) => qty * unit - 500 
相关问题