我是斯卡拉的新手,请原谅我提出这样一个愚蠢的问题。正在查看example如何使用scala对基本DSL进行编程。 想知道是否可以使用vals而不是Order类中的vars重新创建它。 我尝试将val重命名为vars但在to()方法中出现复杂错误,因为我正在尝试重新分配val。
答案 0 :(得分:3)
您需要完成使Order
成为不可变的过程。
这意味着至少创建一个构造函数,以便您可以在创建时设置所有字段并更改所有mutator以创建并返回一个新对象,而不是改变并返回当前对象。
正如亚历克斯所说,通过将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
答案 1 :(得分: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)
...
}