有没有办法调用Scala中使用“val”定义的函数,将整个大括号块作为参数,而不是该块的最终结果?

有没有办法调用Scala中使用“val”定义的函数,将整个大括号块作为参数,而不是该块的最终结果?,scala,function,user-defined-functions,Scala,Function,User Defined Functions,我知道,如果我们想将一段花括号中的代码作为参数传递给使用def定义的函数,我们可以编写: def运行(func:=>Unit){ func } 跑{ 印刷品(1) println(2) }//打印12张 但是有没有一种方法可以通过匿名函数实现同样的风格呢? 我尝试了以下方法: valv:(()=>Unit)=>Unit=(w:()=>Unit)=>{w()} v(()=>{println(1);println(2)})//按预期工作。印刷品12 v{println(1);println(2)}

我知道,如果我们想将一段花括号中的代码作为参数传递给使用
def
定义的函数,我们可以编写:

def运行(func:=>Unit){
func
}
跑{
印刷品(1)
println(2)
}//打印12张
但是有没有一种方法可以通过匿名函数实现同样的风格呢? 我尝试了以下方法:

valv:(()=>Unit)=>Unit=(w:()=>Unit)=>{w()}
v(()=>{println(1);println(2)})//按预期工作。印刷品12
v{println(1);println(2)}//错误:类型不匹配
更正:

()=>单元
不会转换为具有“按名称”参数的函数,该参数允许它接受用大括号括起来的代码作为参数。所以我的问题的第二部分是不正确的

如果我们不在函数文本中重新指定参数类型,Alexey Romanov的答案将非常有效,但如果我们在函数文本中重新指定与变量类型完全匹配的参数类型,则会被视为错误。 例如,如果我们写

valv:(=>Unit)=>Unit=(w)=>{println(0);w}//
valv:(=>Unit)=>Unit=(w:=>Unit)=>{println(0);w}//错误
val v:(Int=>Int)=(w)=>43//
valv:(Int=>Int)=(w:Int)=>43//也可以工作

模式
块:=>类型
按名称参数调用,不必是函数,但可以是计算为类型类型的任何代码块。这就是第一个例子起作用的原因

第二部分不起作用,因为传递的参数:

println(1); println(2)
计算结果为
单位
,与预期类型
()=>单位
不匹配

val v: (=>Unit) => Unit = w => { println(0); w }

v { println(1); println(2) }

println(0)
插入纯粹是为了让您看到这实际上是一个按名称参数:
0
1
2
之前打印,而不是按名称的完全复制,因为
xxx
仍然是
def xxx
而不是
val xxx
@Thilo
val-fun:(布尔,=>Int)=>Int=…
是答案
xxx
是一个
def
使其通用。但是在
def
的示例中,它确实起作用:块
{println(1);println(2);}
被神奇地转换成一个
=>单元
。请解释一下,如果我们不重新指定按名称参数类型,它为什么会起作用,但是,如果我们在函数文本中重新指定与val类型完全匹配的按名称参数类型,则会被视为错误?@black.browsman它遵循规范():函数文本中的参数类型是
类型
,而
函数类型
左侧的类型是
参数类型
。而
=>单元
参数类型
,而不是
类型
。我不知道为什么文本中不允许使用
ParamType
,但我认为没有深层次的原因。你可以问一下。