一个泛型函数,接收两个Fn(&T)->()
参数,两个参数仅生存期不同,怎么写?
参数 fn_long 和 fn_short 要保证类型仅生存期不同, 内存布局完全相同,所以在满足协变逆变条件时可以赋值。
// 大概是这个意思, 语法是错的
fn lifetime_fn_contravariant<'long, 'short, T, F>(mut fn_long: F<'long>, mut fn_short: F<'short>)
where 'long: 'short, F: Fn(&T) -> () {
fn_long = fn_short;
}
1
共 5 条评论, 1 页
评论区
写评论不是用来解决实际问题,仅仅用来验证 Fn 的协变逆变。 写的时候发现类型构造器不能分步骤给出参数,类似于函数柯里化。下面的代码如果能实现,我的问题就可以完全解决:
--
👇
zkx: 你是想要接收两个变量,且要求如下:
Fn、FnMut、FnOnce 都是 trait,实现的 struct 可能各有不同,无法保证相同的内存布局,trait object 可以认为变量拥有相同的内存布局,因为都是以 Box 或者 reference 的形式出现。 但根据前面的回答,貌似无法满足你的需求(虽然个人认为那个方案是没问题的),如此一来就只剩下函数指针了:
不过想了想,总感觉这个场景很怪,建议提供下额外的背景信息,描述想解决什么问题。直接提问怎么才能做到 XXX 可能会绕弯路。
你是想要接收两个变量,且要求如下:
Fn、FnMut、FnOnce 都是 trait,实现的 struct 可能各有不同,无法保证相同的内存布局,trait object 可以认为变量拥有相同的内存布局,因为都是以 Box 或者 reference 的形式出现。 但根据前面的回答,貌似无法满足你的需求(虽然个人认为那个方案是没问题的),如此一来就只剩下函数指针了:
不过想了想,总感觉这个场景很怪,建议提供下额外的背景信息,描述想解决什么问题。直接提问怎么才能做到 XXX 可能会绕弯路。
函数签名相同也不是同一个类型吧,如果要用到捕获变量的闭包看起来需要用 dyn,如果闭包不捕获变量的话倒是可以用函数指针写签名
--
👇
viruscamp: 用了 dyn 不能保证内部是同一类型吧
--
👇
biluohc: 你看看这个行不行,注意得dyn, 否则大约得unsafe强转
用了 dyn 不能保证内部是同一类型吧
--
👇
biluohc: 你看看这个行不行,注意得dyn, 否则大约得unsafe强转
你看看这个行不行,注意得dyn, 否则大约得unsafe强转