Wenn eine Variable vom Typ Vektor oder eine Hash-Karte in Rust erklärt, tun wir:Warum legt Rust manchmal ein :: vor die Parameter in Generika?
let v: Vec<int>
let m: HashMap<int, int>
zu instanziieren, müssen wir new()
nennen. Allerdings haben wir so so:
Vec::<int>::new()
^^
HashMap::<int, int>::new()
^^
Hinweis das plötzliche Auftauchen von ::
. Aus C++ kommend, sind diese merkwürdig. Warum treten diese auf? Ist es einfacher, einen führenden ::
IDENTIFIER :: < IDENTFIER …
zu parsen als IDENTIFIER < IDENTIFIER
, was als eine weniger als Operation interpretiert werden könnte? (Und so, das ist einfach eine Sache, um die Sprache leichter zu parsen? Aber wenn ja, warum nicht auch während der Typspezifikationen tun, damit die beiden sich gegenseitig spiegeln?)
(Wie Shepmaster bemerkt, oft Vec::new()
ist genug; der Typ kann oft abgeleitet werden.)
Sie werden in Rust nicht als * templates * bezeichnet; Ich denke dein C++ wird angezeigt. :-) Anekdotenhaft habe ich noch nie die spezielle Verwendung der Typparameter gesehen. Mit Typinferenz können Sie einfach 'Vec :: new()' sagen.Die einzige Zeit, die ich gesehen habe, den Typ so zu spezifizieren, ist für Funktionen, die ein Merkmal zurückgeben, und Sie müssen einen konkreten Typ wählen, wie 'parse' oder' collect'. – Shepmaster
@Shempmaster: Ack, sie sind Generika, nicht wahr? Und ja, einige Arten von Inferenz können vermeiden, dass Sie den tatsächlichen Typ angeben müssen. Ich denke, ich bin darüber gestolpert, vor allem als Neuling in Rust, der noch nicht erkannt hat, dass Typinferenz das kann und sich immer noch fragt, warum. – Thanatos
Ich denke, es ist eine gute Frage; Ich wusste nicht einmal, dass Sie an diesem Ort Typparameter angeben können! Ich freue mich auf eine Antwort, aber meine Vermutung ist, dass es auf die Einfachheit des Parsens hinauslaufen wird, wie Sie vorgeschlagen haben. Ich wollte nur sagen, dass Ihr Beispielcode nicht üblich ist, in der Hoffnung, anderen Neulingen, die diese Frage lesen, zu helfen. Prost! – Shepmaster