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
tox1
是函数的参数,xn
是Ti
的类型,xi
是要执行的代码(这取决于参数expr
tox1
和范围内的任何内容)xn
def
而不是val
val
引入常量值,该常量值定义为块定义它们的结果。在您的示例中,执行println(“hello”)
,然后其返回值命名为x
。相反,def
引入了一个方法,它的主体在每次调用时都会执行
def x = println("hello")
然后将在每次调用x
时执行。但即使使用def,它仍然不是一个函数。要使其成为功能,您有两个选项:
- 您可以直接定义一个函数
,其中(x1:T1,…,xn:Tn)=>expr
tox1
是函数的参数,xn
是Ti
的类型,xi
是要执行的代码(这取决于参数expr
tox1
和范围内的任何内容)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
。