【问题标题】:Partial Functions and Execute-Once behaviour in ScalaScala 中的偏函数和 Execute-Once 行为
【发布时间】:2015-04-23 18:20:21
【问题描述】:

编辑:我同意投反对票的观点,但不同意解决方案。所以我已经更正/破坏了问题中的代码,所以它有解释的问题。我已经留下了答案和我原来的评论。在我看来,第 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”,其中这种行为是出乎意料的(因此是错误的)答案。现在我实际上正在尝试使用我无法使用的相同行为 - 我也找不到谜题。

【问题讨论】:

  • 投反对票。鉴于所示代码没有显示所描述的问题,我建议删除该帖子 - 您已经得到帮助,这是浪费时间和混乱,直到他们看到您对答案的评论,其他人可以阅读。

标签: scala currying partialfunction


【解决方案1】:

首先,它与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...

【讨论】:

  • 你说得对,我在原始问题中发布的内容确实按预期工作。很遗憾,它遇到了剪切和粘贴错误。具体来说,我的调用代码实际上有“def mySend = sendConfiguredFor(someCfg)” 对“mySend”的后续调用重复调用配置代码。像你一样将“def”更改为“val”,给了我预期的行为。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多