显然,Rust 中的文字是可变的
首先,你需要了解what字面量是 https://stackoverflow.com/q/485119/155423。文字是never可变的,因为它们是字面上地编写在源代码中并编译成最终的二进制文件。您的程序不会更改您的源代码!
显示不能修改文字的示例:
fn main() {
1 += 2;
}
error[E0067]: invalid left-hand side expression
--> src/main.rs:2:5
|
2 | 1 += 2;
| ^ invalid expression for left-hand side
另一方面,可以将文字复制到变量中,然后variable可以改变,但我们仍然没有改变文字1
:
fn main() {
let mut a = 1;
a += 2;
}
说实话,我不知道什么叫“非字面”。文字是一种特定类型表达,但是程序中除了表达式之外还有其他类型的东西。这有点像说“猫”和“非猫”——第二组包括狗、蘑菇、沙子和/或情感吗?
事实上,文字进入堆栈,而非文字进入堆
这两个品质并不真正直接相关。在堆栈上放置非文字非常容易:
fn main() {
let a = 1;
let b = 2;
let c = a + b;
}
所有三个变量都在堆栈上,但没有文字3
源代码中的任何位置。
目前,Rust 不允许对文字值进行堆分配,但这是特定于语言的事情,可能会随着时间的推移而改变。其他语言可能允许它。
事实上,在 Rust 中你必须不遗余力地将一些东西放入堆中。类型如Box
, Vec
, and String
所有调用函数在堆上分配空间。代码使用堆内存的唯一方法是使用这些类型、使用它们的其他类型或以其他方式分配堆内存的类型。
我们无法使用的原因是什么String
文字数据类型
没有String
字面意思——没有。源代码"foo"
创建类型的文字&'static str
. 这些是截然不同的类型 https://stackoverflow.com/q/24158114/155423。具体来说,Rust 语言可以在以下环境中工作:没有堆;没有文字可以假设可以分配内存。
必须专门使用String::from()
String::from
转换自&str
to a String
;它们是两种不同的类型,必须进行转换。
显然,根据示例,在我的代码中,两者都可以是可变的
No, 他们不可以。这是不可能开始的let mut foo = "a"
并将“a”修改为其他任何内容。你can改变什么foo
指着:
let mut foo = "a";
foo
+-----------+
|
|
+---v---+
| |
| "a" |
| |
+-------+
foo = "b";
foo
+----------+
|
|
+-------+ +---v---+
| | | |
| "a" | | "b" |
| | | |
+-------+ +-------+
Neither "a"
nor "b"
永远改变,但是什么foo
指着does.
This 不是 Rust 特有的。例如,Java 和 C# 字符串也是不可变的,但您可以reassign指向不同的不可变字符串的变量。
也可以看看:
- “字面意思”这个词是什么意思? https://stackoverflow.com/q/485119/155423
- 变量名前面的“mut”和“:”后面的“mut”有什么区别? https://stackoverflow.com/q/28587698/155423
- Rust 的 `String` 和 `str` 有什么区别? https://stackoverflow.com/q/24158114/155423