【问题标题】:Scala Anonymous Function - does not behave as I expectedScala 匿名函数 - 不符合我的预期
【发布时间】:2013-02-28 18:37:32
【问题描述】:

我是一个 scala 新手。

我想了解为什么这段代码的行为不像我预期的那样

def invokeFunc( myFunc: () => String ){
    println(myFunc())
  }

  def callInvoker(){
     invokeFunc({ return "this is a string" })
  }

当我调用“callInvoker”时,我什么也得不到。我期望打印“这是一个字符串”,但没有返回。为什么?

【问题讨论】:

  • 您是否有意省略了函数签名后面的“=”?
  • 你能解释一下这个问题吗?
  • def functionName( arg: Arg ): ReturnType = { Body } 是函数的标准定义。您遗漏了告诉编译器您的函数正在返回 Unit 的“=”(在 Java 世界中为 void)。
  • 不是故意的。我知道很多语言,有时会令人困惑。我加 ”;”在python中自动在Java中进行连接..只是还没有机会习惯scala。将努力遵守标准。谢谢。

标签: scala


【解决方案1】:

这是因为return 不是从您的匿名函数返回,而是从封闭方法返回。 因此,在执行invokeFunc({ return "this is a string" }) 时,您实际上是从callInvoker 返回(值"this is a string",因为callInvokerUnit 类型而被丢弃)。

更正后的代码是:

def invokeFunc( myFunc: () => String ){
  println(myFunc())
}

def callInvoker(){
   invokeFunc{() => "this is a string" }
}

callInvoker()

现在您的匿名函数实际上返回 "this is a string"(任何函数/方法都返回其最后一个表达式,除非遇到显式 return,但正如我所解释的,return 适用于封闭方法,而不适用于匿名函数) .

【讨论】:

  • 非常感谢。一旦网站允许,我将接受您的回答。 (最短时间限制)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-04
  • 2011-07-17
相关资源
最近更新 更多