如何在Scala中将函数赋值?

如何在Scala中将函数赋值?,scala,Scala,在Scala中,如何将特定签名的函数分配给适当类型的值 def foo = println("foo") def bar = println("bar") val fnRef : ()=>Unit = //the function named foo or the function named bar 虽然我觉得自己是一个不可原谅的可怕的人,因为我将此作为官方答案提交,但我是应OP的要求这样做的 这个问题可以这样解决: def foo = println("foo") val fnRef

在Scala中,如何将特定签名的函数分配给适当类型的值

def foo = println("foo")
def bar = println("bar")
val fnRef : ()=>Unit = //the function named foo or the function named bar

虽然我觉得自己是一个不可原谅的可怕的人,因为我将此作为官方答案提交,但我是应OP的要求这样做的

这个问题可以这样解决:

def foo = println("foo")
val fnRef = () => foo
或者,正如另一个勇敢的人在删除他的回答之前所说:

def foo = println("foo")
val fnRef = foo _

第二个可能稍微好一点,因为我的(前一个)有点粗糙,实际上创建了一个全新的函数,在应用时只调用现有函数,而后者基本上是现有函数的部分/延迟应用,因为后者在语义上相同,但更惯用Scala(正如Rex Kerr所指出的)。

foo
bar
不是函数,它们是方法。不能将方法分配给名称,因为方法不是对象。

val fnRef=()=>foo
似乎work@Destin你为什么不把你的评论转换成一个答案呢?我接受它……后者是一种惯用的方式。@Destin:注意,
foo\uuuu
语法实际上只是你所谓的“轻度黑客”的糖分。在这种情况下,两个语句的计算结果都是相同的代码。@Debilski哇,谢谢你!我有点不太明白当scalac刚刚为我验证了这一点时,我感到很惊讶。不过,我认为值得注意的是,一旦这两种方法扩展到实际的部分应用程序(
((x:Int,y:Int)=>superFoo(x,y))(1,:Int)
产生的代码与
superFoo(1,\u:Int)
产生的代码不同。不管怎样,谢谢。我已相应地更改了答案。@Destin这不太正确。您的第一个
superFoo
示例执行与第二个示例相同的下划线扩展,但在此之前,您将在另一个函数调用中包装对
superFoo
的调用。未扩展的这将等于
(superFoo)第二个示例实际上扩展为
(x$1:Int)=>superFoo(1,x$1)