相关疑难解决方法(0)

是否有一个带有UTF-16字符串类型的Rust库?(用于编写Javascript解释器)

对于大多数程序,最好在内部使用UTF-8,并在必要时转换为其他编码.但在我的情况下,我想编写一个Javascript解释器,并且只存储UTF-16字符串(或数组u16)更简单,因为

  1. 我需要单独处理16位代码单元(这通常是一个坏主意,但Javascript需要这个).这意味着我需要它来实现Index<usize>.

  2. 我需要存储不成对代理人,即,畸形UTF-16的字符串(正因为如此,ECMAScript的字符串在技术上定义为阵列u16,其通常代表UTF-16的字符串).有一个名为WTF-8的编码用于存储UTF-8中不成对的代理,但我不想使用这样的东西.

我希望拥有通常拥有/借用的类型(如String/ strCString/ CStr)以及所有或最常用的方法.我不想滚动自己的字符串类型(如果我可以避免).

此外,我的字符串将始终是不可变的,位于Rc包含指向所有字符串的弱指针的数据结构后面(并实现字符串实习).这可能是相关的:也许最好是Rc<Utf16Str>作为字符串类型,其中Utf16Str是未定义的字符串类型(可以定义为just struct Utf16Str([u16])).这样可以避免在访问字符串时遵循两个指针,但我不知道如何Rc使用unsized类型实例化.

鉴于上述要求,仅使用防锈编码非常不方便,因为它将所有非UTF-8编码视为矢量u8.

另外,我不确定使用std库是否可以帮助我.我调查了Utf16Units它,它只是一个迭代器,而不是一个正确的字符串类型.(另外,我知道OsString没有帮助 - 我不在Windows上,甚至没有实现Index<usize>)

string utf-16 rust

7
推荐指数
1
解决办法
899
查看次数

为什么 str 主要以借用形式存在?

这是该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? 为什么是参考?

string types reference rust borrowing

6
推荐指数
1
解决办法
554
查看次数

是否可以从Vec <T>创建Arc <[T]>?

更具体地讲,为什么没有 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

4
推荐指数
2
解决办法
636
查看次数

什么是C++的shared_ptr的Rust等价物?

为什么Rust中不允许使用此语法:

fn main() {
    let a = String::from("ping");
    let b = a;

    println!("{{{}, {}}}", a, b);
}
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
Run Code Online (Sandbox Code Playgroud)

实际上,我们可以简单地创建一个引用 - 在运行时它是不一样的:

fn main() {
    let a = String::from("ping"); …
Run Code Online (Sandbox Code Playgroud)

scope shared-ptr ownership rust

2
推荐指数
2
解决办法
1222
查看次数

标签 统计

rust ×4

string ×2

borrowing ×1

ownership ×1

reference ×1

scope ×1

shared-ptr ×1

types ×1

utf-16 ×1