结论:由于impl<'a, T: ?Sized, U: ?Sized> AsRef<U> for &'a T where T: AsRef<U>
会导致冲突
see also
也因此,实现了impl Borrow<T> for T
的Borrow
系trait无法自动级联转换
在未来 impl specialisation 实现后会考虑加入这个实现
1
共 11 条评论, 1 页
结论:由于impl<'a, T: ?Sized, U: ?Sized> AsRef<U> for &'a T where T: AsRef<U>
会导致冲突
see also
也因此,实现了impl Borrow<T> for T
的Borrow
系trait无法自动级联转换
在未来 impl specialisation 实现后会考虑加入这个实现
评论区
写评论不好意思眼瞎了,感谢
--
👇
苦瓜小仔: playground
你有看 BorrowMut 的文档吗。。。
--
👇
TsuITOAR: BorrowMut似乎也没有实现
impl BorrowMut<T> for T
--
👇
苦瓜小仔: BorrowMut 不能满足你要的抽象吗
playground
你有看 BorrowMut 的文档吗。。。
--
👇
TsuITOAR: BorrowMut似乎也没有实现
impl BorrowMut<T> for T
--
👇
苦瓜小仔: BorrowMut 不能满足你要的抽象吗
这个也并没有解决我的问题,我想获取一个
&mut T
,这个函数签名依旧无法传入未显示实现AsMut<T>
(或者说foo<U, T: AsMut<U>>
里的U)的类型,比如我的T
类型本身--
👇
lan: > TsuITOAR:
有考虑过用下面这样的签名吗?
在一些情况下是可用的,但是两个泛型参数会代码语义上的模糊,比如
Vec<T>
实现了AsMut<[T]>
和AsMut<Vec<T>>
,就会导致下面的代码无法编译playground
--
👇
lan: > TsuITOAR:
有考虑过用下面这样的签名吗?
BorrowMut似乎也没有实现
impl BorrowMut<T> for T
--
👇
苦瓜小仔: BorrowMut 不能满足你要的抽象吗
有考虑过用下面这样的签名吗?
BorrowMut 不能满足你要的抽象吗
除了前向兼容的原因我想不到任何其他理由,毕竟第三方库可能为自己的类型实现了这个转换trait
--
👇
TsuITOAR: Trait后面的泛型T被Markdown干没了,抱歉
--
👇
TsuITOAR: 手机上不太方便排版,我大致描述一下
像是Into实现了 Into for T,我因此可以在需要T的地方传入T和任意实现了Into的类型。
但是前几天先用类似的逻辑实现一个可以获取&mut T的类型,发现如果用AsMut的话是无法传入&mut T的,而只能传入显示实现了这个AsMut的类型
Trait后面的泛型T被Markdown干没了,抱歉
--
👇
TsuITOAR: 手机上不太方便排版,我大致描述一下
像是Into实现了 Into for T,我因此可以在需要T的地方传入T和任意实现了Into的类型。
但是前几天先用类似的逻辑实现一个可以获取&mut T的类型,发现如果用AsMut的话是无法传入&mut T的,而只能传入显示实现了这个AsMut的类型
手机上不太方便排版,我大致描述一下
像是Into实现了 Into for T,我因此可以在需要T的地方传入T和任意实现了Into的类型。
但是前几天先用类似的逻辑实现一个可以获取&mut T的类型,发现如果用AsMut的话是无法传入&mut T的,而只能传入显示实现了这个AsMut的类型
为什么需要自动实现 AsMut ?
针对你提的一句话的问题(只有疑问而没有任何描述和补充),没有人喜欢猜测你想知道什么,也没有人会关心你不知道什么。
出于好心,我提供一篇文章
https://mp.weixin.qq.com/s/OdcLb5U8QCeYH08feThN7w