我正在尝试为客户端定义一个干净的界面来使用我的库。下面是一些示例客户端代码。
for (security <- allSecurities) {
val askLast = ask
}
问题是我想“问”自动传递“安全性”。我在父类中执行此操作的尝试如下
var lastSecurity = ""
private val lastAsk = new HashMap[...]
def allSecurities = for {
security <- lastTrade.keySet.toList
} yield {
lastSecurity = security
security
}
def ask = lastAsk(lastSecurity).price
不幸的是,它并没有像我设想的那样工作,因为在客户端lastSecurity在整个循环中具有相同的值而不是动态更新..所以基本上我试图让客户端做
val askLast = ask
而不是
val askLast = ask(security)
我可以在Scala中执行此操作吗?
答案 0 :(得分:3)
你可以通过序列的懒惰“视图”得到你想要的东西,
var lastSecurity: Int = _
val securities = Seq(1, 2).view.map { a =>
lastSecurity = a
a
}
for (s <- securities) {
println("%d %d".format(s, lastSecurity))
}
打印
1 1
2 2
这里的关键思想是,使用惰性视图时,不会立即评估map
,而只是for循环需要元素。
这是另一种方法。我不是推荐这个好代码,但它确实展示了Scala的灵活性,
var lastSecurity: Int = _
class SecurityWrapper(s: Seq[Int]) {
def foreach(f: Int => Unit) {
s.foreach { a =>
lastSecurity = a
f(a)
}
}
}
for (security <- new SecurityWrapper(Seq(1, 2))) {
println("%d %d".format(security, lastSecurity))
}
班级SecurityWrapper
包含自定义foreach
方法。在循环的每次迭代中,它都会写入lastSecurity
变量。 Scala的for
理解糖将自动使用SecurityWrapper.foreach
而不需要我们做任何额外的工作。
答案 1 :(得分:0)
为什么不在父类中创建价格列表并在客户端中使用它?
def myfunc = for(security <- allSecurities) yield {
lastAsk(security).price
}
至于你原来的意图,我猜你可以得到的最近的是:
var askLast = ask _
答案 2 :(得分:0)
这里有一些东西可以避免客户需要传递参数来询问。您可以修改allSecurities
方法以生成包含安全性和请求调用返回的值的元组,即
def allSecurities = for {
security <- lastTrade.keySet.toList
} yield {
(security, lastAsk(security).price)
}
有了这个,客户可以写
for((security,askLast)<-allSecurities){
//to client things with askLast
}