< 返回版块

TsuITOAR 发表于 2022-01-07 02:19

结论:由于impl<'a, T: ?Sized, U: ?Sized> AsRef<U> for &'a T where T: AsRef<U>会导致冲突
see also
也因此,实现了impl Borrow<T> for TBorrow系trait无法自动级联转换
在未来 impl specialisation 实现后会考虑加入这个实现

评论区

写评论
作者 TsuITOAR 2022-01-09 01:05

不好意思眼瞎了,感谢

--
👇
苦瓜小仔: playground

你有看 BorrowMut 的文档吗。。。

--
👇
TsuITOAR: BorrowMut似乎也没有实现impl BorrowMut<T> for T

--
👇
苦瓜小仔: BorrowMut 不能满足你要的抽象吗

苦瓜小仔 2022-01-08 23:28

playground

你有看 BorrowMut 的文档吗。。。

--
👇
TsuITOAR: BorrowMut似乎也没有实现impl BorrowMut<T> for T

--
👇
苦瓜小仔: BorrowMut 不能满足你要的抽象吗

作者 TsuITOAR 2022-01-08 22:23

这个也并没有解决我的问题,我想获取一个&mut T,这个函数签名依旧无法传入未显示实现AsMut<T>(或者说foo<U, T: AsMut<U>>里的U)的类型,比如我的T类型本身

--
👇
lan: > TsuITOAR:

手机上不太方便排版,我大致描述一下
像是Into实现了 Into for T,我因此可以在需要T的地方传入T和任意实现了Into的类型。
但是前几天先用类似的逻辑实现一个可以获取&mut T的类型,发现如果用AsMut的话是无法传入&mut T的,而只能传入显示实现了这个AsMut的类型

有考虑过用下面这样的签名吗?

fn foo<U, T: AsMut<U>>(_: &mut T) { ... }
作者 TsuITOAR 2022-01-08 22:18

在一些情况下是可用的,但是两个泛型参数会代码语义上的模糊,比如Vec<T>实现了AsMut<[T]>AsMut<Vec<T>>,就会导致下面的代码无法编译

fn foo<U:?Sized+std::fmt::Debug, T: AsMut<U>>(s: &mut T) {dbg!(s.as_mut());}

fn call_foo(){
    foo(&mut [1]);//pass
    
    foo(&mut vec![1,2]);//fail
}

playground

error[E0283]: type annotations needed
 --> src/lib.rs:6:5
  |
6 |     foo(&mut vec![1,2]);
  |     ^^^ cannot infer type for type parameter `U` declared on the function `foo`
  |
  = note: cannot satisfy `_: Debug`
note: required by a bound in `foo`
 --> src/lib.rs:1:17
  |
1 | fn foo<U:?Sized+std::fmt::Debug, T: AsMut<U>>(s: &mut T) {dbg!(s.as_mut());}
  |                 ^^^^^^^^^^^^^^^ required by this bound in `foo`
help: consider specifying the type arguments in the function call
  |
6 |     foo::<U, T>(&mut vec![1,2]);
  |        ++++++++

For more information about this error, try `rustc --explain E0283`.

--
👇
lan: > TsuITOAR:

手机上不太方便排版,我大致描述一下
像是Into实现了 Into for T,我因此可以在需要T的地方传入T和任意实现了Into的类型。
但是前几天先用类似的逻辑实现一个可以获取&mut T的类型,发现如果用AsMut的话是无法传入&mut T的,而只能传入显示实现了这个AsMut的类型

有考虑过用下面这样的签名吗?

fn foo<U, T: AsMut<U>>(_: &mut T) { ... }
作者 TsuITOAR 2022-01-08 22:07

BorrowMut似乎也没有实现impl BorrowMut<T> for T

--
👇
苦瓜小仔: BorrowMut 不能满足你要的抽象吗

lan 2022-01-07 17:41

TsuITOAR: 手机上不太方便排版,我大致描述一下
像是Into实现了 Into for T,我因此可以在需要T的地方传入T和任意实现了Into的类型。
但是前几天先用类似的逻辑实现一个可以获取&mut T的类型,发现如果用AsMut的话是无法传入&mut T的,而只能传入显示实现了这个AsMut的类型

有考虑过用下面这样的签名吗?

fn foo<U, T: AsMut<U>>(_: &mut T) { ... }
苦瓜小仔 2022-01-07 15:11

BorrowMut 不能满足你要的抽象吗

作者 TsuITOAR 2022-01-07 14:46

除了前向兼容的原因我想不到任何其他理由,毕竟第三方库可能为自己的类型实现了这个转换trait

--
👇
TsuITOAR: Trait后面的泛型T被Markdown干没了,抱歉

--
👇
TsuITOAR: 手机上不太方便排版,我大致描述一下
像是Into实现了 Into for T,我因此可以在需要T的地方传入T和任意实现了Into的类型。
但是前几天先用类似的逻辑实现一个可以获取&mut T的类型,发现如果用AsMut的话是无法传入&mut T的,而只能传入显示实现了这个AsMut的类型

作者 TsuITOAR 2022-01-07 14:43

Trait后面的泛型T被Markdown干没了,抱歉

--
👇
TsuITOAR: 手机上不太方便排版,我大致描述一下
像是Into实现了 Into for T,我因此可以在需要T的地方传入T和任意实现了Into的类型。
但是前几天先用类似的逻辑实现一个可以获取&mut T的类型,发现如果用AsMut的话是无法传入&mut T的,而只能传入显示实现了这个AsMut的类型

作者 TsuITOAR 2022-01-07 14:39

手机上不太方便排版,我大致描述一下
像是Into实现了 Into for T,我因此可以在需要T的地方传入T和任意实现了Into的类型。
但是前几天先用类似的逻辑实现一个可以获取&mut T的类型,发现如果用AsMut的话是无法传入&mut T的,而只能传入显示实现了这个AsMut的类型

苦瓜小仔 2022-01-07 14:30

为什么需要自动实现 AsMut ?

针对你提的一句话的问题(只有疑问而没有任何描述和补充),没有人喜欢猜测你想知道什么,也没有人会关心你不知道什么。

出于好心,我提供一篇文章

https://mp.weixin.qq.com/s/OdcLb5U8QCeYH08feThN7w

1 共 11 条评论, 1 页