mischen "explodierte" Scheiben und regelmäßige Parameter in variadic Funktionen

8

Ich frage mich, warum es nicht möglich ist, Folgendes in go zu tun:

%Vor%

Nach meinem Verständnis "slice" ... "explodiert" das Slice, so dass es für Multi-Argument-Funktionsaufrufe verwendet werden kann. Das obige Beispiel sollte also tatsächlich auf foo("bar", "baz", "bla") erweitert werden.

foo(stuff...) funktioniert wie erwartet, keine Überraschungen hier, aber im obigen Beispiel beschwert sich der Compiler über zu viele Argumente.

Ist das eine gewünschte Einschränkung? Ich komme aus einem Ruby-Hintergrund, wo ein foo("bar", *stuff) völlig in Ordnung ist (und ist, zumindest in meinem Buch, das gleiche), deshalb überrascht mich das.

    
paukul 20.02.2015, 09:26
quelle

3 Antworten

7

Der Wert für ein Variadic-Argument kann angegeben werden entweder durch Aufzählung der Elemente, oder unter Verwendung eines vorhandenen Slice, angegeben durch seinen Namen, gefolgt von ... .

Sie möchten die zwei möglichen Möglichkeiten mischen, die von der Go-Sprachspezifikation nicht zugelassen werden ( Argumente an% co_de übergeben % -Parameter ).

Wenn das erste Formular verwendet wird (Aufzählung der Elemente):

  

Der als variadic-Parameter übergebene Wert ist ein neues Segment vom Typ ... mit einem neuen zugrunde liegenden Array, dessen aufeinanderfolgende Elemente die eigentlichen Argumente sind.

Wenn Letzteres verwendet wird (Übergabe eines vorhandenen Slices, gefolgt von []T ) wird kein neuer Slice erstellt , der übergebene wird unverändert verwendet. Und der übergebene Slice kann nur verwendet werden, um den Wert von one - den final - variadic-Parameter anzugeben. Der Versuch, sowohl ein einzelnes Element als auch ein Segment zu übergeben, stimmt nicht mit der Signatur (der Parameterliste in diesem Fall) Ihrer Funktion überein und Sie erhalten einen Fehler:

%Vor%

Es gibt kein "Explodieren" in Go. Der Begriff wird nur in anderen Sprachen verwendet, um zu visualisieren, dass das übergebene Array oder Slice kein Element des Variadic-Parameters sein wird, aber sein wird der Wert des variablen Parameters selbst .

Wenn Sie die 2 mischen, müssen Sie einen neuen Slice zuweisen, da das vorhandene Slice offensichtlich nicht verwendet werden kann.

    
icza 20.02.2015, 10:00
quelle
5

Die Spezifikation hierzu lautet " Argumente an ... -Parameter übergeben ":

  

Wenn f variabel ist mit einem letzten Parameter p vom Typ ...T , dann ist in f der Typ von p äquivalent zum Typ []T .
  Wenn f ohne tatsächliche Argumente für p aufgerufen wird, wird p an nil übergeben.
  Andernfalls wird als Wert ein neues Segment vom Typ []T mit einem neuen zugrundeliegenden Array übergeben, dessen aufeinanderfolgende Elemente die eigentlichen Argumente sind, die alle T zugewiesen sein müssen.

In deinem Fall, wo Sachen ... funktionieren:

  

Wenn das letzte Argument einem Slicetyp []T zuweisbar ist, kann es als Wert für einen Parameter ...T unverändert übergeben werden, wenn auf das Argument ... folgt. In diesem Fall wird kein neues Segment erstellt.

Aber "bar", stuff... stimmt nicht mit den beiden oben angegebenen Fällen überein.

T, []T stimmt nicht mit f([]T) überein.

    
VonC 20.02.2015 09:40
quelle
1

Der hässliche Weg, dies zum Laufen zu bringen, ist, es zu einem neuen Variadic zu machen.

%Vor%

Ссылка

    
mvndaai 02.11.2015 22:38
quelle

Tags und Links