问题标签 [trait-objects]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
rust - Sending trait objects between threads in Rust
I'd like to send a trait object between threads, but can't figure out if it's possible. It seems like it might not be, as they apparently do not fulfill the Send
trait.
The following code demonstrates what I'm trying to do:
This fails with the following message:
Trying to send a plain, unboxed trait object results in a bunch of other errors, mostly complaining about not fulfilling Send + Sized
.
I'm still fairly new to Rust, so I'm not sure if there's something I'm missing, but I get the impression that there isn't a way to convince the compiler to make the trait object Send
.
If it isn't currently possible, is there any work currently under way that may allow for this in the future?
syntax - Rust 中的 impl TraitX for TraitY 是什么意思?
例如:
我想这与
但错误消息另有说明:
在 Rust 中(或它impl TraitX for TraitY
的某些具有显式生命周期的变体)是否意味着什么?如果是这样,它的使用示例是什么?
rust - How to get the v-ptr for a given Trait/Struct combination?
In Rust, a &T
where T
is a trait
is a fat reference, which actually corresponds to raw::TraitObject
:
Using TraitObject
, one can de-construct and re-construct a &T
at leisure.
However, while obtaining the vtable
from de-constructing a &T
is easy, what if I never have the &T
in the first place, but just a T
and S
; essentially, something along the lines of:
How could I divine the v-ptr from there? Is there any intrinsic I could use?
Note: the naive implementation of creating a S
(or conjuring it from thin-air) and then making a &T
reference does not work; the compiler complains that T
is not necessarily a trait
and therefore that &T
is either one pointer or two pointers in size.
casting - 我怎样才能施放 Rc到 Rc>>
我有一个 traitMyTrait
和一个MyStruct
实现MyTrait
.
我还有一个接受Rc<RefCell<Box<MyTrait>>>
作为参数的函数。
在代码的某处,我创建了一个实例Rc<RefCell<Box<MyStruct>>>
:
当我传递my_struct
给我的函数时,我得到一个编译器错误:
错误:不匹配的类型:预期alloc::rc::Rc<core::cell::RefCell<Box<MyTrait>>>
,找到alloc::rc::Rc<core::cell::RefCell<Box<MyStruct>>>
我尝试Rc<RefCell<Box<MyStruct>>>
通过显式指定我需要的类型来创建一个实例来解决这个问题:
在这种情况下,传递my_struct
给我的函数可以正常工作,但是我不能再通过变量访问任何MyStruct
特定字段。my_struct
而且这似乎不是一种贬低Rc<RefCell<Box<MyTrait>>>
到Rc<RefCell<Box<MyStruct>>>
.
我该如何解决这个问题?
rust - 我如何通过 Rc>> 到接受 Rc 的函数>>?
我最初在这里问过这个问题,但它被标记为重复,尽管在我看来它只重复了一部分,所以我创建了一个更具体的问题:
考虑以下代码:
这段代码工作正常。现在我想将定义更改trait_func
为接受 a &mut self
,但它Rc
仅适用于不可变数据。我使用的解决方案是包装MyTrait
成RefCell
:
当我编译它时,我得到一个错误:
解决此问题的最佳方法是什么?
rust - 为什么某些 std::fmt::Debug* 方法使用动态调度?
这些方法使用动态调度(接收一个 trait 对象&Debug
作为参数):
这些方法使用静态调度,并根据相关entry
方法编写:
为什么第一个方法列表使用动态调度而不是静态调度?如果使用静态调度,它们的使用会受到限制吗?
rust - 从 u8 切片创建读取特征对象
我正在尝试Read
从切片创建一个特征对象u8
,以便在murmur3
板条箱中使用,就像这样
但我明白了
这段代码有什么问题?
rust - 你如何创建一个盒子,或者一般来说是一个装箱的未调整大小的值?
我有以下代码
它抱怨说
我不明白为什么它需要Sized
on Rng
whenBox<T>
不强加于T
.
rust - Rust 中的混淆错误与特征对象生命周期
谁能告诉下面的代码有什么问题?编译器抱怨生命周期,但错误消息绝对没有意义。我已经尝试了我能想到的一切,但似乎没有任何帮助。
编译器错误是
这完全没有意义。借款人的寿命如何?我什至没有使用借来的价值!