Ich muss ein usize
in ein &str
konvertieren, um zu einem fn foo(&str)
zu gelangen. Ich habe die folgenden zwei Möglichkeiten gefunden, aber ich weiß nicht, ob es einen Unterschied zwischen der Verwendung von as_str()
oder Deref
gibt. Vielleicht ist die Arbeit von self
in as_str
irgendwie mit Deref
verbunden? Ich weiß nicht, ob es besser ist, das eine oder das andere zu verwenden, oder ob sie tatsächlich gleich sind.Was ist der optimale Weg, um ein `usize` in ein` & str` umzuwandeln?
temp.to_string().as_str()
Verwendung:#[inline] #[stable(feature = "string_as_str", since = "1.7.0")] pub fn as_str(&self) -> &str { self }
Mit
&*temp.to_string()
oder&temp.to_string()
. Dies funktioniert überDeref
:#[stable(feature = "rust1", since = "1.0.0")] impl ops::Deref for String { type Target = str; #[inline] fn deref(&self) -> &str { unsafe { str::from_utf8_unchecked(&self.vec) } } }
Die Frage abhängen, was Sie in foo tun wollen: Ist die übergebene
&str
Notwendigkeitfoo
oder nicht zu überleben?
foo(&str)
ist ein minimales Beispiel für s: &str
in diesem Code:
extern crate termbox_sys as termbox;
pub fn print(&self, x: usize, y: usize, sty: Style, fg: Color, bg: Color, s: &str) {
let fg = Style::from_color(fg) | (sty & style::TB_ATTRIB);
let bg = Style::from_color(bg);
for (i, ch) in s.chars().enumerate() {
unsafe {
self.change_cell(x + i, y, ch as u32, fg.bits(), bg.bits());
}
}
}
pub unsafe fn change_cell(&self, x: usize, y: usize, ch: u32, fg: u16, bg: u16) {
termbox::tb_change_cell(x as c_int, y as c_int, ch, fg, bg)
}
@malbarbo 'to_string()' gebe eine 'String' zurück Ich benutze' & * 'für' & str' Ich denke ich brauche '& *' in diesem Fall. Aber nicht, wenn das der beste Weg ist? –
Sie haben Recht, ich eilte darauf. Wenn 'foo' eine Methode wäre, würde 'temp.to_string(). Foo()' eine automatische Deref-Anweisung auf '& str' machen, aber' foo' ist eine Funktion, also '& *' ist notwendig. Die 'usize'-zu-String-Konvertierung ist der richtige Weg. – malbarbo
Wofür optimieren wir? – bluss