Warum werden die Strings in meinem Iterator verkettet?

8

Mein ursprüngliches Ziel ist es, eine Liste von Wörtern, eins in jeder Zeile, zu holen und sie in ein HashSet zu setzen, während Kommentarzeilen verworfen und E / A-Fehler korrekt erhöht werden. Gegeben die Datei "stopwords.txt":

%Vor%

Ich habe es geschafft, den Code so zu kompilieren:

%Vor%

Hier ist ein Spielplatz , der auch die obige Datei erstellt.

Ich würde erwarten, am Ende des Programms einen Satz von 4 Saiten zu haben. Zu meiner Überraschung gibt die Funktion tatsächlich eine Menge zurück, die eine einzige Zeichenkette mit allen verketteten Wörtern enthält:

%Vor%

Geführt von einem Ratschlag in den Dokumenten für FromIterator , I Alle Aufrufe von from_iter wurden entfernt und stattdessen collect verwendet ( Spielplatz ), das hat das Problem tatsächlich gelöst.

%Vor%

Warum führen die vorherigen Aufrufe von from_iter zu unerwarteten Schlussfolgerungen, während collect() genauso funktioniert?

    
E_net4 07.02.2017, 23:58
quelle

1 Antwort

8

Eine einfachere Wiedergabe:

%Vor%

Das Problem besteht darin, dass wir hier den Iterator zweimal sammeln. Der Typ von words ist Result<_, u8> . % Co_de% auch implementiert Result selbst. Wenn wir am Ende also Iterator aufrufen, erkennt der Compiler, dass der from_iter -Typ aufgrund der Methode Ok sein muss Unterschrift. Wenn Sie rückwärts arbeiten, können Sie ein String aus einem Iterator von String konstruieren, also wählt der Compiler das aus.

Das Entfernen des zweiten Strings würde es lösen:

%Vor%

Oder für Ihr Original:

%Vor%

Natürlich würde ich normalerweise stattdessen from_iter empfehlen, da ich die Verkettung bevorzuge:

%Vor%     
Shepmaster 08.02.2017, 00:23
quelle

Tags und Links