如何将可选的闭包参数传​​递给函数?

Sri*_*ian 7 scala

我想将一个闭包传递给一个方法作为一个选项,我正在做如下所示的事情.我收到编译错误,如下所示.是否可以将可选的闭包参数传​​递给函数?

def sampleMethod(a: String, b: String, optionalMethod: Option[(String, Int) => Unit]) {
    // do some processing with a and b
    optionalMethod match {
      case Some(optionalMethod) => {
        optionalMethod("a",3)
      }
      case _
      log("no optional method passed")
    }
}

// definition of optMethod in some other place
val optMethod = (c: String, d: Int) => {
  // some processing with c, d and external values 
}

// invoke
sampleMethod("hi", "bye", optMethod) => FAILS TO COMPILE

ERROR = type mismatch. expecting Option[(String, Int) => Unit] found (String, Int) => Unit
Run Code Online (Sandbox Code Playgroud)

Rég*_*les 8

错误消息非常明确:sampleMethod期望a Option,但是您传递的是直接函数值(未包含在内Some).

解决这个问题的最简单方法是包装optMethodSome:

sampleMethod("hi", "bye", Some(optMethod))
Run Code Online (Sandbox Code Playgroud)

但是如果你想简单地做sampleMethod("hi", "bye", optMethod),你可以添加重载的定义sampleMethod:

object Test {
  def sampleMethod(a: String, b: String, optionalMethod: Option[(String, Int) => Unit]) {
    // do some processing with a and b
    optionalMethod match {
      case Some(optionalMethod) => {
        optionalMethod("a",3)
      }
      case _ => log("no optional method passed")
    }
  }
  def sampleMethod(a: String, b: String) { sampleMethod(a, b, None) }
  def sampleMethod(a: String, b: String, optionalMethod: (String, Int) => Unit) {
    sampleMethod(a, b, Some(optionalMethod)) 
  }
}

val optMethod = (c: String, d: Int) => {
  // some processing with c, d and external values 
}

// invoke
Test.sampleMethod("hi", "bye", optMethod) // Now Compiles fine
Test.sampleMethod("hi", "bye") // This too
Run Code Online (Sandbox Code Playgroud)

  • 然后创建一个私有方法来完成工作并获取`Option [Function]`,然后由带有和不带`Function`的公共方法调用. (2认同)

Fyn*_*ynn 6

如前所述,您的方法需要一个Option包含的值optionalMethod.因此,您必须将Option值传递给它:

// invoke with method
sampleMethod("hi", "bye", Some(optMethod))
// invoke without method
sampleMethod("hi", "bye", None)
Run Code Online (Sandbox Code Playgroud)

如果您想避免该Option值(特别是避免None),您可以尝试以下方法:

def sampleMethod(a: String, b: String, optionalMethod: (String, Int) => Unit = (_, _) => log("no optional method passed")) {
  optionalMethod("a", 3)
}

// invoke with method
sampleMethod("hi", "bye", optMethod)
// invoke without method
sampleMethod("hi", "bye")
Run Code Online (Sandbox Code Playgroud)


Wil*_*ger 3

怎么样

sampleMethod("hi", "bye", Some(optMethod))
Run Code Online (Sandbox Code Playgroud)