我希望这可行:
trait Task<R, E> {
fn run(&self) -> Result<R, E>;
}
mod test {
use super::Task;
struct Foo;
impl<uint, uint> Task<uint, uint> for Foo {
fn run(&self) -> Result<uint, uint> {
return Err(0);
}
}
fn can_have_task_trait() {
Foo;
}
}
fn main() {
test::can_have_task_trait();
}
......但它没有:
<anon>:10:3: 14:4 error: the trait `core::kinds::Sized` is not implemented for the type `<generic #0>`
<anon>:10 impl<uint, uint> Task<uint, uint> for Foo {
<anon>:11 fn run(&self) -> Result<uint, uint> {
<anon>:12 return Err(0);
<anon>:13 }
<anon>:14 }
<anon>:10:3: 14:4 note: the trait `core::kinds::Sized` must be implemented because it is required by `Task`
<anon>:10 impl<uint, uint> Task<uint, uint> for Foo {
<anon>:11 fn run(&self) -> Result<uint, uint> {
<anon>:12 return Err(0);
<anon>:13 }
<anon>:14 }
<anon>:10:3: 14:4 error: the trait `core::kinds::Sized` is not implemented for the type `<generic #1>`
<anon>:10 impl<uint, uint> Task<uint, uint> for Foo {
<anon>:11 fn run(&self) -> Result<uint, uint> {
<anon>:12 return Err(0);
<anon>:13 }
<anon>:14 }
<anon>:10:3: 14:4 note: the trait `core::kinds::Sized` must be implemented because it is required by `Task`
<anon>:10 impl<uint, uint> Task<uint, uint> for Foo {
<anon>:11 fn run(&self) -> Result<uint, uint> {
<anon>:12 return Err(0);
<anon>:13 }
<anon>:14 }
error: aborting due to 2 previous errors
playpen: application terminated with error code 101
Program ended.
那么,发生了什么?
我不知道这个错误意味着什么。
我是否正在使用Result并且要求U,V不是大小的?在哪种情况下,为什么它们大小?我没写:
Task<Sized? R, Sized? E>
现在所有仿制药都是动态尺寸还是什么? (在这种情况下,什么是大小?甚至是什么意思?)
发生了什么事?
答案 0 :(得分:5)
您只需删除<uint, uint>
中的impl<uint, uint>
,因为类型参数会在那里而不是具体类型:
impl Task<uint, uint> for Foo { ... }
我认为你得到的错误是编译器对未使用的类型参数感到困惑。它也出现在这个超级缩减版本中:
trait Tr {}
impl<X> Tr for () {}
答案 1 :(得分:2)
Rust不提供«泛型专业化»:您将特征定义为Task<R, E>
,您必须使用泛型类型(R
和E
)来实现它。
不可能只使用特定类型来实现它,就像您尝试使用<uint, uint>
一样。
例如,如果你写了:
trait Foo<R> {}
struct Bar;
struct Baz;
impl<Baz> Foo<Baz> for Bar {}
你应该不期望你的实现集团中的Baz
与你的struct Baz
相同:它被遮蔽,就像var
参数一样函数会影响var
个全局变量。
然而,当你用原始类型执行此操作时,却得到这个神秘的错误消息而不是简单的阴影,这个可能是一个错误,要么你应该有阴影或更清晰的错误信息。