下面这个例子的原意图是将这个异步方法存起来放进Vec中, 再在别的地方用unsafe恢复方法并运行. 因为方法都是编译期就知道大小的, 所以它的指针的地指应该是不变的, 内容也不变, 所以应该是安全的? 但是下面这个例子是编译不过的, 因为AsyncFn是Trait Object, 无法直接cast 成 *const ().
请问要怎么编写这段代码? (使用unsafe是故意的)
Ext Link: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=e825dc6483bcf5097389e4a33221d13f
1
共 7 条评论, 1 页
评论区
写评论to_raw_parts
好像可以用,但感觉不需要,可以直接存&dyn Trait
或*const dyn Trait
:lz可以看看这个讲dispatch和fat pointer的视频(b站搬运),这个up主的rust内容都挺不错的,lz可以关注关注!
lz给出的看起来是 static dispatch,
dyn Trait
才是 trait object 吧!用的话都用&dyn Trait
或者Box<dyn Trait>
,这个我记得是由数据地址+vtable地址组成的 fat pointer,stdlib有一个unstable的to_raw_parts可以拿到数据地址和vtable地址(metadata),(&dyn Trait as *const _).to_raw_parts()
,lz可以试试!这玩法好复杂,核心问题是Out的类型可能要支持多个,导致必须使用Trait对象吧,遇到过类似的问题,后面解决的也不漂亮。
提一点浅见,Trait Object应该本来就不是指针,是栈上的对象吧,我觉得你可以用Box::Leak()试试
搞不定, 他的case和我的case不一样, 他的生命周期是在外面用+号串起来, 我这个是在泛型的<>里面的, 搞不懂
--
👇
Bai-Jinlin: 你参考这个吧 https://docs.rs/futures-task/0.3.28/src/futures_task/future_obj.rs.html
感谢!我晚上研究一下, 它的目标与我的似乎是一致的
--
👇
Bai-Jinlin: 你参考这个吧 https://docs.rs/futures-task/0.3.28/src/futures_task/future_obj.rs.html
你参考这个吧 https://docs.rs/futures-task/0.3.28/src/futures_task/future_obj.rs.html