2016-04-27 5 views
2

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?

  1. temp.to_string().as_str() Verwendung:

    #[inline] 
    #[stable(feature = "string_as_str", since = "1.7.0")] 
    pub fn as_str(&self) -> &str { 
        self 
    } 
    
  2. Mit &*temp.to_string() oder &temp.to_string(). Dies funktioniert über Deref:

    #[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 Notwendigkeit foo 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) 
} 

termbox_sys

+0

@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? –

+0

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

+0

Wofür optimieren wir? – bluss

Antwort

1

Wie Sie bemerkt haben, as_str nichts zu tun scheint. Tatsächlich gibt es self, ein, wo ein &str erwartet wird. Dies veranlasst den Compiler, einen Aufruf an Deref einzufügen. Deine zwei Wege sind also genau gleich.

Verwandte Themen