Was ist der Rückgabetyp der Indizierung?

9

Ich versuche, ziemlich erfolglos, mit Scheiben herumzuspielen.

Ich habe mein erstes Problem auf:

reduziert %Vor%

Ich erwarte, dass der Rückgabetyp von slice[index] eine Referenz ist, wenn man die Dokumentation betrachtet :

%Vor%

Der Compiler gibt mir jedoch einen Fehler:

  %Vor%

Ich interpretiere das so, dass der Typ von item nicht mit dem Rückgabetyp der Funktion übereinstimmt (Ich habe item ausschließlich zum Zweck der Fehlersuche eingeführt, um die Ausdruckauswertung von return zu trennen).

Wenn ich den Rückgabetyp auf T umschalte, was der Typ von item ist, bekomme ich eine andere Fehlermeldung:

  %Vor%

Nachdem ich ein bisschen herumgebastelt habe, habe ich zwei Workarounds gefunden:

%Vor%

Erzwingt den Typ, um eine Referenz zu sein, macht den Trick.

Warum sind diese Spielereien überhaupt notwendig? Mache ich etwas falsch?

    
Matthieu M. 10.01.2015, 17:40
quelle

2 Antworten

8

Dies ist ein bisschen hilfreiche Ergonomie, die der Compiler für Sie tut, um den Code ein bisschen schöner aussehen zu lassen.

Der Rückgabewert von Index trait ist eine Referenz, aber der Compiler fügt automatisch eine Dereferenz für Sie ein , wenn Sie die gezuckerte Syntax [] verwenden. Die meisten anderen Sprachen würden das Objekt einfach aus dem Array zurückgeben (kopieren oder einen anderen Verweis auf das Objekt zurückgeben, was auch immer angebracht ist).

Aufgrund der Bedeutung der Semantik für Verschieben / Kopieren von Rust können Sie nicht immer einen Wert kopieren. In diesen Fällen verwenden Sie normalerweise & :

%Vor%

Beachten Sie, dass der Indizierungswert auch automatisch als Referenz verwendet wird, ähnlich wie bei der automatischen Dereferenzierung.

    
Shepmaster 10.01.2015, 17:51
quelle
5

Nein, du machst alles richtig. Während die Methode index() einen Verweis zurückgibt, wird das Ergebnis bei einer Indizierung automatisch dereferenziert. Dies geschieht, damit die Indexierung natürlicher ist: In jeder Sprache, in der eine Art Indexierungsoperator existiert (hauptsächlich C und C ++), gibt sie Werte selbst zurück, nicht die Referenzen in Container.

Um eine Referenz in die Sammlung zu erhalten, müssen Sie entweder einen Referenzoperator explizit anwenden (wie in Ihrer ersten "Problemumgehung") oder Referenzmuster (wie in der zweiten) verwenden.

    
Vladimir Matveev 10.01.2015 17:46
quelle

Tags und Links