Scala val x={println(";hello";)}作为内联函数

Scala val x={println(";hello";)}作为内联函数,scala,Scala,我执行以下任务:- val x = { println("hello") } 这将打印hello并将x的类型打印为:- x: Unit = () 我的理解是,已经创建了一个内联函数并将其分配给val x。基于这个假设,我尝试将x作为:- x 它不会出错。但也不打印任何内容。这不是x所持有的一个函数吗?这一行的作用是: val x = { println("hello") } 这是:它执行println(“hello”),然后将println返回的值赋值为x。由于println返回Unit

我执行以下任务:-

val x = { println("hello") }
这将打印hello并将x的类型打印为:-

x: Unit = ()
我的理解是,已经创建了一个内联函数并将其分配给val x。基于这个假设,我尝试将x作为:-

x
它不会出错。但也不打印任何内容。这不是x所持有的一个函数吗?

这一行的作用是:

val x = { println("hello") }
这是:它执行
println(“hello”)
,然后将
println
返回的值赋值为
x
。由于
println
返回
Unit
x
将被分配
Unit

要执行的操作(将函数分配给
x
)的正确语法如下:

然后,您可以使用以下命令调用该函数:

x()
(这是
x.apply()
)的简写语法。

此行的作用:

val x = { println("hello") }
这是:它执行
println(“hello”)
,然后将
println
返回的值赋值为
x
。由于
println
返回
Unit
x
将被分配
Unit

要执行的操作(将函数分配给
x
)的正确语法如下:

然后,您可以使用以下命令调用该函数:

x()

(这是
x.apply()
)的简写语法。

您不是将函数分配给x,而是将块的结果分配给x。立即执行该块,并将结果(单位)分配给x

块的结果是块中最后一条语句的结果,println()的结果是Unit

将为x分配一个函数,可以这样调用:

x()

不是将函数指定给x,而是将块的结果指定给x。立即执行该块,并将结果(单位)分配给x

块的结果是块中最后一条语句的结果,println()的结果是Unit

将为x分配一个函数,可以这样调用:

x()

或者,您可以使用
def
而不是
val
val
引入常量值,该常量值定义为块定义它们的结果。在您的示例中,执行
println(“hello”)
,然后其返回值命名为
x
。相反,
def
引入了一个方法,它的主体在每次调用时都会执行

def x = println("hello")
然后将在每次调用
x
时执行。但即使使用def,它仍然不是一个函数。要使其成为功能,您有两个选项:

  • 您可以直接定义一个函数
    (x1:T1,…,xn:Tn)=>expr
    ,其中
    x1
    to
    xn
    是函数的参数,
    Ti
    xi
    的类型,
    expr
    是要执行的代码(这取决于参数
    x1
    to
    xn
    和范围内的任何内容)


或者,您可以使用
def
而不是
val
val
引入常量值,该常量值定义为块定义它们的结果。在您的示例中,执行
println(“hello”)
,然后其返回值命名为
x
。相反,
def
引入了一个方法,它的主体在每次调用时都会执行

def x = println("hello")
然后将在每次调用
x
时执行。但即使使用def,它仍然不是一个函数。要使其成为功能,您有两个选项:

  • 您可以直接定义一个函数
    (x1:T1,…,xn:Tn)=>expr
    ,其中
    x1
    to
    xn
    是函数的参数,
    Ti
    xi
    的类型,
    expr
    是要执行的代码(这取决于参数
    x1
    to
    xn
    和范围内的任何内容)


使用
def
代替
val
使用
def
代替
val
{…}
是一个块,而不是匿名函数。另外,函数和匿名函数在Scala中没有区别,因为Scala只有匿名函数和方法。@IonuțG.Stan感谢您的澄清,我已经更新了我的答案。@IonuțG.Stan关于
class LengthFunc extends(String=>Int){def apply(s:String)=s.length}
val f=new LengthFunc
f
是否为命名函数?与
val f=(s:String)=>s.length
相反,它是一个匿名函数。@dcastro这是一个很好的观点。是的,这是一个命名函数。我从来没有想过它,因为我更倾向于把它看作一个类而不是一个函数,但它确实是一个函数。@dcastro实际上,
objectlengthfunc extends(String=>Int)
将是一个命名函数,也就是说,
object
而不是
class
{…}
是一个块,而不是一个匿名函数。另外,函数和匿名函数在Scala中没有区别,因为Scala只有匿名函数和方法。@IonuțG.Stan感谢您的澄清,我已经更新了我的答案。@IonuțG.Stan关于
class LengthFunc extends(String=>Int){def apply(s:String)=s.length}
val f=new LengthFunc
f
是否为命名函数?与
val f=(s:String)=>s.length
相反,它是一个匿名函数。@dcastro这是一个很好的观点。是的,这是一个命名函数。我从来没有想过它,因为我更倾向于将它视为一个类而不是一个函数,但它确实是一个函数。@dcastro实际上,
objectlengthfunc extends(String=>Int)
将是一个命名函数,即,
object
而不是
class