什么是将字符串转换为&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
是这种情况下必要的。
一般认为在可行的情况下要避免类型归属,所以第二种形式是不可取的。在第一个和第三个之间,对于哪一个更加可取尚未达成共识。
但是,如果第二种形式不需要类型归属,即在可以推断'&str'的上下文中,比如将参数传递给非泛型函数时,它就很好。 – delnan 2015-03-13 15:24:00