Scala中的部分函数和执行一次行为

Scala中的部分函数和执行一次行为,scala,currying,partialfunction,Scala,Currying,Partialfunction,编辑:我同意反对票的情绪,但不同意解决方案。因此,我已更正/破坏了问题中的代码,因此它具有所解释的问题。我把答案和我最初的评论留给了它。在我看来,第12行的“def vs val”对于像我这样的初学者来说是一个不明显的问题 我有一些Scala,我正试图编写,但我不能让它完全按照我想要的方式运行 我想做的是调用一些函数,这个函数应该接受一些配置参数,然后配置另一个函数并返回它。然后调用方将重复使用返回的函数,知道它是以某种方式配置的。对返回函数的重复调用不应导致重新运行(昂贵的)配置 比如, 1

编辑:我同意反对票的情绪,但不同意解决方案。因此,我已更正/破坏了问题中的代码,因此它具有所解释的问题。我把答案和我最初的评论留给了它。在我看来,第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拼图”,其中这种beaviour是意外的(因此是错误的)答案。现在我实际上在尝试使用我无法使用的相同行为-我也找不到拼图器。

首先,它与…无关-不要弄乱它们

第二,它与
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...
def发送(主机:字符串,端口:Int)(消息:字符串)={
println(“发送…”)
}
def sendConfiguredFor(cfg:Any)={
val host=“localhost”
val端口=8080
println(“配置…”)//将只调用一次
发送(主机、端口)_
}
scala>val mySend=sendConfiguredFor(空)
配置。。。
mySend:String=>Unit=
scala>mySend(“msg1”)
发送。。。
scala>mySend(“msg2”)
发送。。。

你说得对,我在原始问题中发布的内容确实起到了预期的作用。很遗憾,它出现了剪切粘贴错误。具体地说,我的调用代码实际上有“def mySend=sendConfiguredFor(someCfg)”,对“mySend”的后续调用重复调用配置代码。将“def”更改为“val”,就像您所做的那样,这会给我带来预期的行为。谢谢你的帮助。投票表决。鉴于显示的代码没有显示所描述的问题,我建议删除该帖子-你已经得到了帮助,这是浪费时间和混乱,直到他们看到你对答案的评论,让其他人阅读。