4

正如我们所知,我们可以在 scala 中定义一个重复参数(varargs)函数,如下所示:

def func(s: String*) = println(s)

我的问题是如何以函数文字样式重写上述内容。还是不可能做到这一点?

(s: String) => println(s)不正确。

4

2 回答 2

9

众所周知,我们可以在 scala 中定义一个多参数函数,如下所示:

def func(s: String*) = println(s)

实际上,这不是函数,而是方法。两者在 Scala 中是根本不同的。

我的问题是如何以函数文字样式重写上述内容。还是不可能做到这一点?

注意(s: String*) => println(s)不正确。

您不能在函数文字中定义 varargs 参数。在 Scala 错误跟踪器中有一个关于此的错误报告和 Martin Odersky 本人的评论,基本上说这太复杂了。

然而,有几种作弊方法。

如果您对函数参数使用类型推断,即如果您在参数静态已知为可变参数的上下文中使用函数文字,那么一切正常:

val func: (String*) => Unit = s => println(s)

或者,您可以定义一个方法,然后通过 η-expansion 将其转换为部分应用的函数:

def meth(s: String*) = println(s)

val func = meth _
于 2012-07-24T10:03:08.367 回答
2

正如评论中所写。您可以通过首先定义一个方法然后使用“指向”该方法的函数来作弊:

> def m(str:String*) = println(str)
m: (str: String*)Unit

> val f = m _
f: String* => Unit = <function1>

> f("1", "2")
WrappedArray(1, 2)
于 2012-07-24T09:49:09.040 回答