对于大多数程序,最好在内部使用UTF-8,并在必要时转换为其他编码.但在我的情况下,我想编写一个Javascript解释器,并且只存储UTF-16字符串(或数组u16)更简单,因为
我需要单独处理16位代码单元(这通常是一个坏主意,但Javascript需要这个).这意味着我需要它来实现Index<usize>.
我需要存储不成对代理人,即,畸形UTF-16的字符串(正因为如此,ECMAScript的字符串在技术上定义为阵列u16,其通常代表UTF-16的字符串).有一个名为WTF-8的编码用于存储UTF-8中不成对的代理,但我不想使用这样的东西.
我希望拥有通常拥有/借用的类型(如String/ str和CString/ CStr)以及所有或最常用的方法.我不想滚动自己的字符串类型(如果我可以避免).
此外,我的字符串将始终是不可变的,位于Rc包含指向所有字符串的弱指针的数据结构后面(并实现字符串实习).这可能是相关的:也许最好是Rc<Utf16Str>作为字符串类型,其中Utf16Str是未定义的字符串类型(可以定义为just struct Utf16Str([u16])).这样可以避免在访问字符串时遵循两个指针,但我不知道如何Rc使用unsized类型实例化.
鉴于上述要求,仅使用防锈编码非常不方便,因为它将所有非UTF-8编码视为矢量u8.
另外,我不确定使用std库是否可以帮助我.我调查了Utf16Units它,它只是一个迭代器,而不是一个正确的字符串类型.(另外,我知道OsString没有帮助 - 我不在Windows上,甚至没有实现Index<usize>)
这是该str类型的使用方式:
let hello = "Hello, world!";
// with an explicit type annotation
let hello: &'static str = "Hello, world!";
Run Code Online (Sandbox Code Playgroud)
let hello: str = "Hello, world!"; 造成 expected `str`, found `&str`
为什么文本的默认类型str与所有原始类型、向量和String? 为什么是参考?
更具体地讲,为什么没有 Arc<T>实现from_raw与动态调整T,同时Box<T> 呢?
use std::sync::Arc;
fn main() {
let x = vec![1, 2, 3].into_boxed_slice();
let y = Box::into_raw(x);
let z = unsafe { Arc::from_raw(y) }; // ERROR
}
Run Code Online (Sandbox Code Playgroud)
(玩)
正如在注释中指出的那样,Arc::from_raw 必须使用指针来自Arc::into_raw,所以上面的例子没有意义.我原来的问题(是否有可能Arc<[T]>从a 创建Vec<T>)仍然存在:这是可能的,如果没有,为什么?
为什么Rust中不允许使用此语法:
fn main() {
let a = String::from("ping");
let b = a;
println!("{{{}, {}}}", a, b);
}
Run Code Online (Sandbox Code Playgroud)
当我尝试编译这段代码时,我得到了:
Run Code Online (Sandbox Code Playgroud)error[E0382]: use of moved value: `a` --> src/main.rs:5:28 | 3 | let b = a; | - value moved here 4 | 5 | println!("{{{}, {}}}", a, b); | ^ value used here after move | = note: move occurs because `a` has type `std::string::String`, which does not implement the `Copy` trait
实际上,我们可以简单地创建一个引用 - 在运行时它是不一样的:
fn main() {
let a = String::from("ping"); …Run Code Online (Sandbox Code Playgroud)