val x = {println(“hello”)} as asline function

时间:2015-07-08 12:45:37

标签: scala

我执行以下任务: -

val x = { println("hello") }

打印hello并将x的类型打印为: -

x: Unit = ()

我的理解是已创建内联函数并将其分配给val x。因此,我尝试将x执行为: -

x

它没有错误。但也没有打印。这不是x持有的功能吗?

3 个答案:

答案 0 :(得分:4)

这一行做了什么:

val x = { println("hello") }

是这样的:它执行println("hello")然后将println返回的内容分配给值x。由于println返回Unitx将被分配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代替valval引入了定义为定义它们的块的结果的常量值。在您的示例中,执行println("hello"),然后将其返回值命名为x。相反,def引入了一种方法,每次调用它时都会执行它。

def x = println("hello")
每次调用x时都会执行

。但即使使用def,它仍然不是一个功能。要使其成为一种功能,您有两种选择:

  • 您可以直接定义一个函数(x1 : T1, ..., xn : Tn) => expr,其中x1xn是函数的参数,Tixi的类型并且expr是您要执行的代码(取决于参数x1xn以及范围内的任何内容。

    scala> val x = () => println("hello")
    x: () => Unit = <function0>
    
  • 或者您可以像以前一样定义方法,并使用语法methodName _将您的方法转换为函数:

    scala> def x = println("hello")
    x: Unit
    
    scala> x _
    res0: () => Unit = <function0>