error[E0392]: parameter `T` is never used
--> src\solver.rs:5:31
|
5 | pub struct Solver <'e, E: 'e, T, M, C>
| ^ unused parameter
|
= help: consider removing `T`, referring to it in a field, or using a marker such as `PhantomData`
我知道T
T
(或可以?)定义方程式。是否有较短的版本可以编写?
这是我想避免的奇怪的事情,所以我不知道如何解决这个问题。
当仿制药的边界类型时,仅对使用边界类型的特征(调用其方法或访问其字段等)的编译器才有意义。否则通常不需要限制事情。有理由这样做,但是只有在实现需求时才添加它们是一件好事。当声明通用参数时,同样适用。除非在结构内明确使用该参数,否则不需要添加它,无论是否可能需要它。
在下面的代码中,
PhantomData
除了将其固定在数组中以外,没有做任何事情,因此可以是任何类型。这很灵活
impl
Solver
需要在其数组中的
E
中调用pub trait Equation {
type T;
fn eq(&self) -> Self::T;
}
pub struct Solver<'e, E: 'e> {
equations: &'e [E],
}
impl<'e, E: 'e> Solver<'e, E> {
fn get_e(&self, i: usize) -> &'e E {
&self.equations[i]
}
}
方法。尽管如此,到目前为止,还没有在struct定义中限制
Solver
。界限仅在实施中具有含义。
eq()
上面的编译会罚款。结构仅在乎其具有任何类型的E
及其寿命遵循E
。而且
pub struct Solver<'e, E: 'e> {
equations: &'e [E],
}
impl<'e, E: 'e, F> Solver<'e, E>
where
E: Equation<T = F>,
{
fn get_e(&self, i: usize) -> &'e E {
&self.equations[i]
}
fn e_eq(&self, i: usize) -> F {
self.equations[i].eq()
}
}
变得更加具体。在这方面,对于结构,
E
可以在某种程度上独立。我们没有添加任何限制,直到源于返回类型并做某事的需要。并且添加了一个新的通用参数,因为它必须是 - 立即使用它,并且会满足编译器。
above,将
'e
返回的特定类型推迟到通用参数impl
。到目前为止,impl
可以采用任何返回任何类型
.eq()
dem de n decle de the decle的thow-与
.eq()
的相关联 - 并从
F
.返回。
要限制更多事情,并确保可以消除
Solver
从其
E
方法中返回的任何return the the the the the the the the the the the theT
可以消除,并且可以在
Solver
:的范围内指定的类型。
F
到目前为止,所有的变化都是必需的,没有影响e_eq()
的定义 - 只是E
.。 我个人发现延期这样的事情是一种很好的方法。根据需要逐步添加界限,同时不断确保代码构建每个步骤可以节省时间,而不是提前宣布几件事。如果我想到需要添加的几件事,我会将它们放入todo评论中,然后一次进行更改。如果您正在从某种形式的设计文档中工作,而队友正在实施将取决于您提供的作品的事物,则可以将所需的方法添加到
Solver
中,并根据需要将其添加到范围内,并在其中将方法带有i32
eq()
宏。让编译器给您提示您需要添加的范围。
仅在有公共字段时才需要在
F
声明中进行限制,并且该程序的其他部分对这些字段支持的接口或属性做出了假设。
从文档中:使用:
零大小的类型用于标记“行为”的事物,它们拥有T.
将一个幻影字段添加到您的类型上,告诉编译器 您的类型的作用好像它存储了T型的值,即使 不是真的。计算某些安全性时使用此信息 属性
E
Playground