泛型和相关类型之间有什么区别?

Dou*_*oug 2 rust

我的印象是这两件事只是在语义上不同.

但是,这是可能的:

struct Foo;

trait Bar<T> {
  fn resolve(&self) -> T;
}

impl Bar<isize> for Foo {
  fn resolve(&self) -> isize {
    return 0isize;
  }
}

impl Bar<usize> for Foo {
  fn resolve(&self) -> usize {
    return 1usize;
  }
}

#[test]
fn test_foo() {
  let foo = Foo;
  assert!((&foo as &Bar<isize>).resolve() == 0isize);
  assert!((&foo as &Bar<usize>).resolve() == 1usize);
}
Run Code Online (Sandbox Code Playgroud)

虽然这不是:

struct Foo;

trait Bar {
  type T;
  fn resolve(&self) -> Self::T;
}

impl Bar for Foo {
  type T = isize;
  fn resolve(&self) -> isize {
    return 0isize;
  }
}

impl Bar for Foo {
  type T = usize;
  fn resolve(&self) -> usize {
    return 1usize;
  }
}

#[test]
fn test_foo() {
  let foo = Foo;
  assert!((&foo as &Bar<T = isize>).resolve() == 0isize);
  assert!((&foo as &Bar<T = usize>).resolve() == 1isize);
}
Run Code Online (Sandbox Code Playgroud)

它产生:

<anon>:8:1: 13:2 error: conflicting implementations for trait `Bar` [E0119]
<anon>: 8 impl Bar for Foo {
<anon>: 9   type T = isize;
<anon>:10   fn resolve(&self) -> isize {
<anon>:11     return 0isize;
<anon>:12   }
<anon>:13 }
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

对于我正在尝试实现的内容,是否有特殊的语法,或者是否真的存在......技术性...通用和相关类型之间的区别?

在某些情况下,相关类型与使用通用类型相比具有有形(而不是纯粹的代码可否)优势吗?

Vla*_*eev 5

我将重复我的评论:类型参数和相关类型确实只是在语义上不同.然而,这就是为什么它们都存在于语言中的主要原因- 它们各自独立工作,因此它不是"仅仅"语义差异,而是它们作为与类型参数分开存在的全部原因.

请注意,我甚至没有触及语法差异.当然,存在语法差异是绝对自然的.毕竟这些是独立的功能; 如果他们没有语法差异,那么你如何区分他们呢?它们的语法差异与语义差异密切相关,因为定义相关类型的方式清楚地表明它们具有"输出"位置,与类型参数的"输入"位置相比,但在技术上它们都是类型参数和相关类型(以及隐含的Self,参数,顺便说一下)是一回事.