2013-02-28 84 views
1

我是一个scala新手。斯卡拉匿名函数 - 不像我预期的那样行为

我想明白为什么,因为我希望它

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

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

当我调用“callInvoker”我什么也没得到这个代码不行为。我期待打印“这是一个字符串”,但没有任何回报。为什么?

+0

你有意离开了“=”函数签名后面? – peri4n 2013-02-28 10:46:29

+0

你能解释一下这个问题吗? – 2013-02-28 10:47:13

+1

def functionName(arg:Arg):ReturnType = {Body}是函数的标准定义。你忽略了'=',它告诉编译器你的函数正在返回Unit(在Java世界中是void)。 – peri4n 2013-02-28 10:49:00

回答

4

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

一个修正的代码如下:

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

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

callInvoker() 

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

+0

非常感谢。一旦网站允许我接受我的答案。 (最短时间限制)。 – 2013-02-28 10:43:14