相关疑难解决方法(0)

如何从"Box"中获取自有值?

这个函数的实现是什么:

fn unbox<T>(value: Box<T>) -> T {
    // ???
}
Run Code Online (Sandbox Code Playgroud)

文档中唯一看起来像我想要的功能Box::into_raw.以下将进行类型检查:

fn unbox<T>(value: Box<T>) -> T {
    *value.into_raw()
}
Run Code Online (Sandbox Code Playgroud)

这给出了错误error[E0133]: dereference of raw pointer requires unsafe function or block.将其包装在一个unsafe { ... }块中可以修复它.

fn unbox<T>(value: Box<T>) -> T {
    unsafe { *value.into_raw() }
}
Run Code Online (Sandbox Code Playgroud)

这是正确的实施吗?如果是这样,为什么它不安全?这是什么意思?

也许这个问题显示了我对如何Box实际工作的一般不确定性.

unsafe rust

20
推荐指数
1
解决办法
1万
查看次数

如何将具有关联类型的特征装箱?

我对 Rust 很陌生,所以我可能会混淆术语。

我想使用hashes crate 做一些散列,我想动态地选择在运行时使用哪种算法(sha256、sha512 等)。

我想写这样的东西:

let hasher = match "one of the algorithms" {
    "sha256" => Box::new(Sha256::new()) as Box<Digest>,
    "sha512" => Box::new(Sha512::new()) as Box<Digest>
    // etc...
};
Run Code Online (Sandbox Code Playgroud)

我有点明白这是行不通的,因为Digest没有指定所需的关联类型。如果我尝试填写它们:

"sha256" => Box::new(Sha256::new()) as Box<Digest<<OutputSize = U32, BlockSize = U64>>>,
Run Code Online (Sandbox Code Playgroud)

我留下了一个错误:the trait 'digest::Digest' cannot be made into an object。我认为这种方法无论如何都会失败,因为match在不同算法具有不同关联类型的情况下,返回的类型略有不同。

我错过了一些明显的东西吗?如何动态创建实现 trait 的东西的实例,然后保留那个东西并通过 trait 接口使用它?

traits rust associated-types

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

Rust 的 Trait 对象如何处理移动实例的方法?

以下是我对 Rust 方法如何工作的基本假设:

foo.method();
Run Code Online (Sandbox Code Playgroud)

其中method定义为method(&self)并且foo是 的一个实例Foo,

Foo::method(&foo);
Run Code Online (Sandbox Code Playgroud)

我对 Trait Objects 的理解是一个有两个空指针的结构,一个指向数据,另一个指向函数指针(vtable)

接受 Trait 对象并调用该 Trait 对象上的方法的多态函数将编译为查看 Trait 对象中方法的偏移量并传入数据指针

但是如果该方法移动了实例呢?如果我错了,请纠正我,但要调用虚拟移动方法,该函数必须将存储在 Trait 对象中的实际数据推送到堆栈上,而不仅仅是数据指针。显然在编译时无法知道数据大小,那么这里发生了什么?这是 VLA 类型的情况,还是我误解了移动的工作原理?

methods polymorphism vtable rust

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

标签 统计

rust ×3

associated-types ×1

methods ×1

polymorphism ×1

traits ×1

unsafe ×1

vtable ×1