是否可以通过scala中的函数文字编写重复参数函数?

时间:2012-07-24 09:24:42

标签: scala multiparameter

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

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

我的问题是如何在函数文字样式中重写上述内容。或者这样做不可能吗?

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

2 个答案:

答案 0 :(得分:9)

  

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

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

实际上,这不是一个功能,这是一种方法。这两者在Scala中根本不同。

  

我的问题是如何在函数文字样式中重写上述内容。或者这样做不可能吗?

     

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

您无法在函数文字中定义varargs参数。 Scala bug跟踪器中有关于此的错误报告以及Martin Odersky自己的评论,基本上说这会太复杂。

然而,有几种方法可以作弊。

如果对函数参数使用类型推断,即如果在静态地知道参数是varargs参数的上下文中使用函数文字,那么一切正常:

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

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

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

val func = meth _

答案 1 :(得分:2)

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

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

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

> f("1", "2")
WrappedArray(1, 2)