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

2024-01-05

我找到了多种转换方法String to &str。今天哪一个是正确/惯用的?

let string = "hello".to_string();

let string_slice1 = &string[..];
let string_slice2: &str = &string;
let string_slice3 = &*string;

如果在变量声明中不指定类型,如何使第二种方法起作用?就像是&string as &str(但它不起作用)。我看到&string has &String类型,但当它被隐式转换为&str,它将执行隐式转换。如何使该转换明确?


这里有两件重要的事情String实现:

  • Index<RangeFull, Output = str>: 这使得string[..]属于类型str,尽管您需要引用它(通过调用方法,允许 autoref 发生,或者显式地作为&string[..])。这解释了string_slice1.

  • Deref<Target = str>: 这使得*string属于类型str,对未调整大小的类型的考虑与索引中相同。这就是为什么string_slice3有效并且有一些隐藏的行为为什么string_slice2 works.

与 C++ 不同,&不是纯引用运算符:它还允许首先进行取消引用。&string因此通常是类型&String,但它可能是这样的类型&str如果需要的话也可以。例如,如果您要将其传递给一个采用&str,它会起作用,或者如果您尝试将其绑定到类型的变量&str。这就是为什么: &str对于这种情况是必要的。

普遍的共识是,在可行的情况下应避免类型归属,因此第二种形式是不可取的。在第一个和第三个之间,对于哪个更可取尚未达成共识。

还有String::as_str https://doc.rust-lang.org/std/string/struct.String.html#method.as_str,有些人更喜欢:

let string_slice4 = string.as_str();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将字符串转换为 &str 的惯用方法是什么? 的相关文章

随机推荐