我执行以下任务: -
val x = { println("hello") }
打印hello并将x的类型打印为: -
x: Unit = ()
我的理解是已创建内联函数并将其分配给val x。因此,我尝试将x执行为: -
x
它没有错误。但也没有打印。这不是x持有的功能吗?
答案 0 :(得分:4)
这一行做了什么:
val x = { println("hello") }
是这样的:它执行println("hello")
然后将println
返回的内容分配给值x
。由于println
返回Unit
,x
将被分配Unit
。
您要执行的操作的正确语法(将函数指定给x
)是:
val x = () => { println("hello") }
然后您可以使用以下方法调用该函数:
x()
(这是x.apply()
的简写语法。)
答案 1 :(得分:1)
您没有为x分配函数,而是将块的结果赋给x。立即执行该块,并将结果(单位)分配给x。
块的结果是块中最后一个语句的结果,println()的结果是Unit。
val x = () => { println("hello") }
将为x分配一个函数,可以这样调用:
x()
答案 2 :(得分:0)
或者,您可以使用def
代替val
。 val
引入了定义为定义它们的块的结果的常量值。在您的示例中,执行println("hello")
,然后将其返回值命名为x
。相反,def
引入了一种方法,每次调用它时都会执行它。
def x = println("hello")
每次调用x
时都会执行。但即使使用def,它仍然不是一个功能。要使其成为一种功能,您有两种选择:
您可以直接定义一个函数(x1 : T1, ..., xn : Tn) => expr
,其中x1
到xn
是函数的参数,Ti
是xi
的类型并且expr
是您要执行的代码(取决于参数x1
到xn
以及范围内的任何内容。
scala> val x = () => println("hello")
x: () => Unit = <function0>
或者您可以像以前一样定义方法,并使用语法methodName _
将您的方法转换为函数:
scala> def x = println("hello")
x: Unit
scala> x _
res0: () => Unit = <function0>