我们可以定义一个“str”类型的变量吗?

Den*_*ive 7 types reference slice rust

我引用官方文档

引用代表某种拥有价值的借用。

来自 C、Java、Perl 和 PHP,我将“引用”视为值的地址(或指针)。可以声明“T”类型的变量或对“T”类型变量的引用(或指针)(在 Perl 中使用&- 或\)。

然而,我不确定这种表示对于 Rust 来说是否完全有效。有件事让我烦恼。

我总是看到“字符串切片”被作为参考进行操作,即以其借用的形式(&str)。

我(到目前为止)从未见过“ str”类型的变量。

我试图声明一个类型为“ str”的变量...但是编译器不允许我这样做。

问题:我们可以定义一个“ str”类型的变量吗?

如果不可能,则意味着我们面临着一种只能声明为引用的数据类型。这看起来很奇怪...

Bla*_*ans 6

不,您不能定义类型的变量str。这是因为变量是堆栈分配的,为了实现这一点,编译器需要在编译时知道变量的大小(这是一般规则,不是 Rust 特有的)。但是,这意味着在编译时无法知道str: !Sized类型值的大小。str因此,str必须始终在其他地方分配:例如在堆上或在数据段中。

但这并不意味着您被迫将其“隐藏”在借位后面&,Rust 中还有其他指针。例如,可以交叉 a &mut str、 a *const str、 a *mut str、 a Rc<str>、 a Box<str>,这样的例子不胜枚举。


Kev*_*eid 5

使用不稳定的功能 unsized_locals,可以动态大小的值移动到堆栈变量中:

\n
#![feature(unsized_locals)]\n\nfn main() {\n    let x: Box<str> = "abc".into();\n    let y: str = *x;\n    \n    println!("{}", &y);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

此功能不完整 \xe2\x80\x94 它只能在 Rust 编译器的夜间版本上使用,并且可能会出现错误。它可能永远不会进入稳定的 Rust 版本。

\n

即使如此,也有充分的理由不这样做:您正在分配由输入数据确定的堆栈内存量。如果数据恰好大于堆栈以及使用堆栈的其他所有内容的容量,那么您将面临堆栈溢出的巨大风险。

\n

如今,您几乎永远不需要未确定大小的局部变量:您始终可以将值放入 a 中Box(至少,如果您不使用内存分配器进行编程)。因此,缺乏此功能并不会真正限制您可以编写的程序。但原则上,它是可能存在的。

\n