我找到了很多将String转换为& str的方法。今天哪一个是正确/惯用的?
let string = "hello".to_string();
let string_slice1 = &string[..];
let string_slice2: &str = &string;
let string_slice3 = &*string;
另外我想知道如何在不指定变量声明类型的情况下使#2方法工作?像&string as &str
之类的东西(但它不起作用)。我可以看到& string有& String类型但是当它隐式地转换为& str时,它会执行隐式转换。如何明确转换?
答案 0 :(得分:9)
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
对于这种情况是必要的。
普遍的共识是在可行的情况下应避免使用类型归属,因此第二种形式是不可取的。在第一个和第三个之间,尚未就哪个更为理想达成共识。