2015-03-13 101 views
3

我發現了很多方法來將字符串轉換爲& str。今天哪一個是正確的/慣用的?什麼是將字符串轉換爲&str的慣用方式?

let string = "hello".to_string(); 
let string_slice1 = &string[..]; 
let string_slice2: &str = &string; 
let string_slice3 = &*string; 

另外我想知道如何使#2方法的工作沒有在變量聲明中指定類型?像&string as &str(但它不起作用)。我可以看到&字符串有&字符串類型,但是當它隱式轉換爲& str時,它將執行隱式轉換。如何使轉換明確?

回答

8

這裏有兩個重要的事情String工具:

  • Index<RangeFull, Output = str>:這使得string[..]str類型,儘管你需要對它的引用(通過調用一個方法,讓autoref到發生,或明確地爲&string[..])。這解釋了string_slice1

  • Deref<Target = str>:這使得*string的類型爲str,對未分類類型的考慮與索引中的考慮類似。這就是爲什麼string_slice3工作原理以及爲什麼string_slice2有效的一些隱藏行爲。

不像在C++,&不是純參考操作員:它還允許解除引用到第一發生。因此&string通常將是&String類型,但如有必要,它也可能是&str。例如,如果您要將它傳遞給採用&str的方法,則該方法可行,或者如果您嘗試將其綁定到類型爲&str的變量。這就是爲什麼: &str是這種情況下必要的。

一般認爲在可行的情況下要避免類型歸屬,所以第二種形式是不可取的。在第一個和第三個之間,對於哪一個更加可取尚未達成共識。

+1

但是,如果第二種形式不需要類型歸屬,即在可以推斷'&str'的​​上下文中,比如將參數傳遞給非泛型函數時,它就很好。 – delnan 2015-03-13 15:24:00

相關問題