为什么“类型参数从未使用”,即使它在某个子句中使用? 我对Rust是个新手,我一直在解决这个问题,我不知道该如何解决。我有一个像 酒吧结构求解器

问题描述 投票:0回答:1
总是给我这个错误,

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

generics rust
1个回答
7
投票
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 the

T

可以消除,并且可以在
Solver
的范围内指定的类型。
F
到目前为止,所有的变化都是必需的,没有影响
e_eq()
的定义 - 只是
E
.
。
我个人发现延期这样的事情是一种很好的方法。根据需要逐步添加界限,同时不断确保代码构建每个步骤可以节省时间,而不是提前宣布几件事。如果我想到需要添加的几件事,我会将它们放入todo评论中,然后一次进行更改。
如果您正在从某种形式的设计文档中工作,而队友正在实施将取决于您提供的作品的事物,则可以将所需的方法添加到
Solver
中,并根据需要将其添加到范围内,并在其中将方法带有
i32

eq()

宏。让编译器给您提示您需要添加的范围。

仅在有公共字段时才需要在
F
声明中进行限制,并且该程序的其他部分对这些字段支持的接口或属性做出了假设。
    
从文档中:
使用:

零大小的类型用于标记“行为”的事物,它们拥有T.
将一个幻影字段添加到您的类型上,告诉编译器
您的类型的作用好像它存储了T型的值,即使
不是真的。计算某些安全性时使用此信息
属性

E

Playground


    
	

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.