什么是将字符串转换为&str的惯用方式?

问题描述:

我发现了很多方法来将字符串转换为& 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时,它将执行隐式转换。如何使转换明确?

这里有两个重要的事情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