Scala 中的部分函数和 Execute-Once 行为
Partial Functions and Execute-Once behaviour in Scala
编辑:我同意反对票的观点,但不同意解决方案。所以我有 corrected/broken 问题中的代码,所以它存在所解释的问题。我已经留下了答案和我原来的评论。在我看来,第 12 行的 "def vs val" 对于像我这样的初学者来说是一个不明显的问题。
我有一些 Scala 正在尝试编写,但我无法让它完全按照我想要的方式运行。
我想做的是调用一些函数,这个函数应该接受一些配置参数,然后配置另一个函数和 return。调用者将重复使用这个 returned 函数,知道它是以某种方式配置的。重复调用 returned 函数不应导致(昂贵的)配置重新 运行.
例如;
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")
以上是我目前所拥有的内容的编辑 cut/paste。我实现的问题是每次调用 "mySend" 都会重新 运行 整个 "sendConfigurationFor",这不是我想要的。
我确定我读过一篇 "Scala Puzzler",其中这种行为是出乎意料的(因此是错误的)答案。现在我实际上正在尝试使用我无法使用的相同行为 - 而且我也找不到益智游戏。
首先,与PartialFunction
- don't mess them with 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...
编辑:我同意反对票的观点,但不同意解决方案。所以我有 corrected/broken 问题中的代码,所以它存在所解释的问题。我已经留下了答案和我原来的评论。在我看来,第 12 行的 "def vs val" 对于像我这样的初学者来说是一个不明显的问题。
我有一些 Scala 正在尝试编写,但我无法让它完全按照我想要的方式运行。
我想做的是调用一些函数,这个函数应该接受一些配置参数,然后配置另一个函数和 return。调用者将重复使用这个 returned 函数,知道它是以某种方式配置的。重复调用 returned 函数不应导致(昂贵的)配置重新 运行.
例如;
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")
以上是我目前所拥有的内容的编辑 cut/paste。我实现的问题是每次调用 "mySend" 都会重新 运行 整个 "sendConfigurationFor",这不是我想要的。
我确定我读过一篇 "Scala Puzzler",其中这种行为是出乎意料的(因此是错误的)答案。现在我实际上正在尝试使用我无法使用的相同行为 - 而且我也找不到益智游戏。
首先,与PartialFunction
- don't mess them with 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...