Scala

时间:2015-04-23 18:20:22

标签: scala currying partialfunction

编辑:我同意投票的情绪,但不同意解决方案。所以我已经纠正/破坏了问题中的代码,因此它解决了问题。我已经把答案和原来的评论留给了它。在我看来,第12行的“def vs val”对于像我这样的初学者来说是一个非显而易见的问题。

我有一些我正在尝试编写的Scala,但我无法让它按照我想要的方式运行。

我想要做的是调用一些函数,这个函数应该接受一些配置参数,然后配置另一个函数并返回它。然后调用者将重复使用此返回的函数,因为它知道它是以某种方式配置的。重复调用返回的函数不应导致(昂贵的)配置重新运行。

例如;

1   private def send(host : String, port : Int)(msg : String) = {
2    // send msg to host:port
3  }
4 
5  def sendConfiguredFor(cfg : ConfigOptions) = {
6    // expensive function to figure out what host/port to use
7    val host = ...
8    val port = ...
9
10  send(host, port) _
11 }

然后调用者应该能够;

12 def mySend = sendConfiguredFor(someCfg)
13 mySend("msg1")
14 mySend("msg2")

以上是我迄今为止编辑的剪切/粘贴。我的实施问题是每次调用“mySend”都会重新运行整个“sendConfigurationFor”,这不是我想要的。

我确定我读过一个“Scala Puzzler”,其中这种beaviour是意想不到的(因而也是错误的)答案。现在我实际上试图使用我无法做到的相同行为 - 我也找不到益智游戏。

1 个答案:

答案 0 :(得分:2)

首先,它与PartialFunction无关 - 不要与partially applied functions混淆。

其次,它与val

一样正常工作
def send(host : String, port : Int)(msg : String) = {
  println("sending...")
}

def sendConfiguredFor(cfg : Any) = {

  val host = "localhost"
  val port = 8080

  println("configuring...") //will be called only once

  send(host, port) _
}

scala> val mySend = sendConfiguredFor(null)
configuring...
mySend: String => Unit = <function1>

scala> mySend("msg1")
sending...

scala> mySend("msg2")
sending...