2010-03-15 26 views
6

En lugar deScala: cómo especificar varargs como tipo?

def foo(configuration: (String, String)*) 

me gustaría ser capaz de escribir:

type Configuration = (String, String)* 
def foo(configuration: Configuration) 

El caso de uso principal es proporcionar un fácil firma del método cuando imperiosa de subclases

ACTUALIZACIÓN: Puedo acercarme por

type Param = (String, String) 
def foo(configuration: Param*) 

¿Pero hay alguna manera de hacerlo mejor?

Respuesta

9

No, el * solo está permitido en un ParamType, que es el tipo de parámetro para una función o método anónimo.

4.6.2 repetida Parámetros Sintaxis: ParamType :: = Type ‘’ El último parámetro valor de una sección parámetro puede incluir el sufijo “”, por ejemplo, (..., x: T *). El tipo de dicho parámetro repetido dentro del método es entonces la secuencia tipo scala.Seq [T]. Los métodos con repetido T parámetros * toman un número variable de argumentos de tipo T.

El error compilador @ ejemplo de Eastsun está en la primera línea, no el segundo. Esto no se debe permitir:

scala> type VarArgs = (Any*) 
defined type alias VarArgs 

He criado a un bug.

Esta es una restricción similar a los parámetros de By-Name. En este caso, el compilador impide la creación del tipo alias:

scala> type LazyString = (=> String) <console>:1: error: no by-name parameter type allowed here 
     type LazyString = (=> String) 

Su último intento es la forma estándar de expresar esto.

+0

¡Reparado ya! https://lampsvn.epfl.ch/trac/scala/ticket/3180 – retronym

2

Creo que se podría utilizar

type Configuration = ((String, String)*) 
def foo(configuration: Configuration) 

pero hace que el compilador de accidente (2.8.0.r21161-b20100314020123). Parece un error del compilador scala.

1

se podría definir como

type Param = (String, String) 
type Configuration = Seq[Param] 

def foo(configuration : Configuration) 

el usuario tiene que construir un ejemplo Seq

foo(List("1"->"2")) 

que no es óptimo.

Cuestiones relacionadas