我的印象是这两件事只是在语义上不同.
但是,这是可能的:
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)
我错过了什么吗?
对于我正在尝试实现的内容,是否有特殊的语法,或者是否真的存在......技术性...通用和相关类型之间的区别?
在某些情况下,相关类型与使用通用类型相比具有有形(而不是纯粹的代码可否)优势吗?
我将重复我的评论:类型参数和相关类型确实只是在语义上不同.然而,这就是为什么它们都存在于语言中的主要原因- 它们各自独立工作,因此它不是"仅仅"语义差异,而是它们作为与类型参数分开存在的全部原因.
请注意,我甚至没有触及语法差异.当然,存在语法差异是绝对自然的.毕竟这些是独立的功能; 如果他们没有语法差异,那么你如何区分他们呢?它们的语法差异与语义差异密切相关,因为定义相关类型的方式清楚地表明它们具有"输出"位置,与类型参数的"输入"位置相比,但在技术上它们都是类型参数和相关类型(以及隐含的Self,参数,顺便说一下)是一回事.
| 归档时间: |
|
| 查看次数: |
824 次 |
| 最近记录: |