2010-03-15 16 views
6

StattScala: wie varargs als Typ angeben?

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

Ich möchte in der Lage sein, zu schreiben:

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

Der Hauptanwendungsfall ist eine einfache Methode Signatur zu schaffen, wenn in Subklassen

zwingenden

UPDATE: Ich kann nah kommen

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

Aber gibt es einen Weg, es besser zu machen?

Antwort

9

Nein, die * ist nur für einen ParamType zulässig, also den Typ eines Parameters für eine anonyme Funktion oder eine Methode.

4.6.2 Wiederholte Parameter Syntax: ParamType :: = Type ‚‘ Der letzte Wert Parameter eines Parameterbereich durch „“ werden kann suffixed , z.B. (..., x: T *). Der Typ eines solchen wiederholten Parameters innerhalb der Methode ist dann die Sequenz Typ scala.Seq [T]. Methoden mit wiederholt Parameter T * nehmen eine variable Anzahl von Argumenten des Typs T.

Der Compiler Bug @ Beispiel Eastsun ist in der ersten Zeile, nicht die zweite. Dies sollte nicht erlaubt sein:

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

ich ein bug angehoben habe.

Dies ist eine ähnliche Einschränkung wie By-Name Parameter. In diesem Fall wird verhindert, dass der Compiler die Erstellung des Typs Alias:

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

Ihr letzter Versuch, die Standard-Weg, dies auszudrücken.

+0

Bereits behoben! https://lampsvn.epfl.ch/trac/scala/ticket/3180 – retronym

2

ich glaube, Sie

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

verwenden könnte, aber es macht den Compiler crash (2.8.0.r21161-b20100314020123). Es scheint ein Fehler des Scala-Compilers zu sein.

1

Man könnte es definieren als

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

def foo(configuration : Configuration) 

der Benutzer eine Seq Instanz zu konstruieren hat

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

, die nicht optimal ist.