我只是想问为什么Rust决定使用&str
而不是String
来表示字符串字面值。难道Rust不可能自动将字符串字面值转换为String
并将其放在堆上,而不是将其放在栈上吗?
我只是想问为什么Rust决定使用&str
而不是String
来表示字符串字面值。难道Rust不可能自动将字符串字面值转换为String
并将其放在堆上,而不是将其放在栈上吗?
ro.data
中的值无法删除是个问题?Rust能否假装它已经被删除并继续执行,还是这样会引起问题?(编辑:我实际上想知道为什么str存在,字符串字面量似乎是答案的重要部分。) - BlackShiftro.data
中(尽管跨平台可能也很困难),然后避免掉落,但这会使实现更加复杂。
类型String
和str
在Vec<T>
和[T]
中都有对应的类型。由于Rust的所有权模型和共享引用,你真的需要像&str
这样的东西,不仅仅是因为字符串字面量。 - PaulString
拥有并可以修改其数据,而不是你想要在 ro.data
的字符串字面量/对象上进行的操作。 - PaulString
更容易进行反向工程?我对反向工程并不是很了解,但我总是希望程序更难以被反向工程。 - sgon00String
保证引用堆分配的数据。你甚至可以将其转换为Box<str>
和Vec<u8>
,而无需重新分配内存。我认为只要String不是mut,这应该是可能的。 - 没有所谓的非mut String
- 只要你拥有它,你总是可以使其变成mut。 - user4815162342str
的函数,看看如果对字符串字面量调用这些函数会发生什么。显然这样的函数是存在的,例如 make_ascii_uppercase()
,它需要一个 &mut str
。但是,我唯一能够创建 &mut str
的方法是通过像 String
或 Box
这样的堆分配结构复制 &str
。因为 let mut s = s;
在 &str
上不起作用,因为“它在 & 引用后面”。因此,似乎不可能在字符串字面量上调用这样的原地修改函数。 - BlackShift