2013-03-13 15 views
18

Dies ist für den aktuellen 0.6 Rust Koffer übrigens, nicht sicher, die genaue commit.Wie transformiere ich & str zu ~ str in Rust?

Nehmen wir an, ich möchte für jeden über einige Zeichenfolgen, und meine Schließung nimmt eine geborgt String Zeiger Argument (& str). Ich möchte, dass mein Closure sein Argument zu einem eigenen Vektor von Strings ~ ~ [~ str] hinzufügt, die zurückgegeben werden sollen. Mein Verständnis von Rust ist schwach, aber ich denke, dass Streicher ein spezieller Fall sind, in dem man sie nicht mit * dereferenzieren kann. Wie bekomme ich meine Strings von & in die Push-Methode des Vektors, die eine ~ str nimmt?

Hier einige Code, der nicht

fn read_all_lines() -> ~[~str] { 
    let mut result = ~[]; 
    let reader = io::stdin(); 
    let util = @reader as @io::ReaderUtil; 
    for util.each_line |line| { 
     result.push(line); 
    } 
    result 
} 

Es nicht kompiliert nicht kompilieren, weil es aufgrund der Art ist Folgern zu sein [& str], da das ist, was auf sie ich schieben. Ganz zu schweigen von seiner Lebensdauer wird falsch sein, da ich eine Variable von kürzerer Lebensdauer hinzufügen.

Ich weiß, ich könnte ReaderUtils read_line() -Methode verwenden, die eine ~ str zurückgibt. Aber das ist nur ein Beispiel.

Also, wie bekomme ich eine eigene Zeichenfolge aus einer geborgten Zeichenfolge? Oder bin ich total falsch verstanden.

+0

Diese weniger relevant jetzt gegeben ist, dass Rust bei 1 ist. X. (Rost 1.X verwendet 'String' und' & str', nicht '~ str'. Daher wäre es hilfreich, dies als vor Rust 1.0 zu bezeichnen. Ich hoffe, dass die Suchmaschinenrelevanz entsprechend angepasst werden kann. –

+0

Ich könnte hier aus der Reihe sein, aber ich habe dafür gestimmt, diese Frage zu schließen, da es nicht für die aktuelle Rust-Syntax gilt, die nicht enthält ~ –

Antwort

11

sollten Sie die Methode des StrSlice Eigenschaft nennen, to_owned, wie in:

fn read_all_lines() -> ~[~str] { 
    let mut result = ~[]; 
    let reader = io::stdin(); 
    let util = @reader as @io::ReaderUtil; 
    for util.each_line |line| { 
     result.push(line.to_owned()); 
    } 
    result 
} 

StrSlice Charakterzug docs sind hier:

http://static.rust-lang.org/doc/core/str.html#trait-strslice

4

Sie können nicht.

Zum einen funktioniert es nicht semantisch: Ein ~str verspricht, dass nur eine Sache es zu einer Zeit besitzt. Aber ein &str ist ausgeliehen, also was passiert mit dem Ort, von dem du dich ausgeliehen hast? Es hat keine Möglichkeit zu wissen, dass du versuchst, seine einzige Referenz zu stehlen, und es wäre ziemlich unhöflich, die Daten des Anrufers darunter zu verwerfen.

Zum anderen ist es nicht logisch funktioniert: ~ -pointers und @ -pointers in ganz anderen Haufen zugeordnet sind, und ein & nicht die Haufen nicht kennt, so kann es nicht zu ~ umgewandelt werden und garantieren Sie immer noch, dass die zugrunde liegenden Daten am richtigen Ort leben.

So können Sie entweder read_line verwenden oder eine Kopie machen, was ich bin ... nicht ganz sicher, wie :)

ich tun fragen, warum die API wie das ist, wenn & die meisten eingeschränkt ist der Zeiger. ~ sollte hier genauso gut funktionieren; es ist nicht wie die iterierten Strings bereits woanders existieren und müssen ausgeliehen werden.

+0

Danke. Das macht sehr viel Sinn. – Ross

4

Zuerst dachte ich, es wäre möglich, copy line zu verwenden, um besitzenden Zeiger vom geliehenen Zeiger zur Zeichenkette zu schaffen, aber dieser kopiert offenbar eingegrabenen Zeiger.

So fand ich str::from_slice(s: &str) -> ~str. Das ist wahrscheinlich das, was du brauchst.

+0

Ich habe auch "Zeile kopieren" versucht. Es schien mir komisch, dass sie eine Möglichkeit bieten würden, alle Zeilen zu lesen, aber es gibt dir geliehene Zeiger und du kannst sie nicht kopieren. Es scheint, dass str :: from_slice eine unsichere rohe Byte-Kopie verwendet. – Ross

+1

Ja, es erstellt eine Kopie der Zeichenfolge. Genau das, was Sie benötigen, um einen eigenen Zeiger zu erstellen. Ich glaube nicht, dass es wichtig ist, wenn unter der Funktion ein unsicherer Anruf ist, wenn es wie vorgesehen funktioniert. Jedenfalls haben wir auf der tiefsten Ebene unsichere Operationen. –

+4

'.to_str()' sollte auch funktionieren. – brson