gpt4 book ai didi

rust - 需要类型注解——为什么关联类型被区别对待?

转载 作者:行者123 更新时间:2023-11-29 08:11:37 25 4
gpt4 key购买 nike

在下面的程序(play)中,FooBar特质提供了 bar方法,而是 bar 返回的对象的实际类型似乎是隐藏的。如果我使用类型参数而不是关联类型,它会起作用(play)。

为什么关联类型被区别对待?还是我做错了?

use std::ops::DerefMut;

pub trait FooBar: Sized {
type Assoc: Sized + DerefMut<Target=Self>;

fn foo(&mut self) -> Option<Self::Assoc>;

fn bar(mut this: Self::Assoc) -> Result<Self::Assoc, Self::Assoc> {
unimplemented!()
}
}

#[derive(Debug)]
struct Test(u32);

impl FooBar for Test {
type Assoc = Box<Test>;
fn foo(&mut self) -> Option<Self::Assoc> {
unimplemented!()
}
}

fn main() {
let mut tt = Test(20);
let tt_foo: Box<Test> = tt.foo().unwrap(); // this is ok
let tt_bar: Box<Test> = FooBar::bar(Box::new(tt)).unwrap(); // but not this
assert_eq!(tt_bar.0, 20);
}

最佳答案

如果你的方法是

fn bar(mut this: Self::Assoc) -> Result<Self::Assoc, Self::Assoc>

然后你尝试调用它

FooBar::bar(Box::new(tt))

Rust 如何知道 Self 是什么类型? Box::new(tt)Self::Assoc 对的,但是你不能从中得到 Self,有几种类型可能有相同的 Assoc

这就是 rustc 提示的地方:

type annotations required

您必须注释Self 是什么类型:

let tt_bar: Box<Test> = <Test as FooBar>::bar(Box::new(tt)).unwrap();

或等同于:

let tt_bar: Box<Test> = Test::bar(Box::new(tt)).unwrap();

关于rust - 需要类型注解——为什么关联类型被区别对待?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36670098/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com