我们知道我们可以在scala中定义一个重复参数(varargs)函数,如下所示:
def func(s: String*) = println(s)
我的问题是如何在函数文字样式中重写上述内容。或者这样做不可能吗?
注意:(s: String) => println(s)
不正确。
答案 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)