Scala是否可以在以下示例中自动传递参数?

时间:2011-08-17 03:33:44

标签: scala

我正在尝试为客户端定义一个干净的界面来使用我的库。下面是一些示例客户端代码。

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中执行此操作吗?

3 个答案:

答案 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
}