У меня есть этот код (in playground):Matching общий параметр для другого обобщенного параметра с осущ
trait Limit {}
pub trait Trait
{
fn give<T>(&self, x: T) -> T
where T: Limit;
}
struct Struct<T: Limit> {field: T}
impl<T> Trait for Struct<T>
where T: Limit
{
fn give<S>(&self, x: S) -> S
where S: Limit
{
self.field
//interacts with x parameter and gives an "S: Limit" result
}
}
То, что я хочу сделать, это сохранить подпись give
функции признака Trait
и в то же время для реализации признака Trait
для общей структуры Struct
.
, но я получаю эту ошибку
<anon>:17:8: 17:14 error: mismatched types:
expected `S`,
found `T`
(expected type parameter,
found a different type parameter) [E0308]
<anon>:17 self.field
^~~~~~
Я думал использовать то, что я видел в этом question, который соответствует соответствующему параметру с общим параметром, поэтому я изменил:
fn give<S>(&self, x: S) -> S
where S: Limit
к:
fn give<S = T>(&self, x: S) -> S
where S: Limit
Я не получил ошибку об этом синтаксисе, но он wa Это решение ошибки выше.
Есть ли способ достичь того, что я хочу сделать?
И побочный вопрос, что <S = T>
на самом деле в этом случае?
Спасибо за ответ, да, это было бы решением, однако реализация этого изменяет подпись функции 'give'. Если честно, то, что я хочу, не использует дженерики по признаку 'Trait', поскольку это приводит к использованию дженериков в других чертах, которые зависят от него, чего я хочу избежать. – Otobo
Наконец, в моем случае, используя ваше предложение в сочетании с объявлением общей черты «Trait» как «Self», когда я определяю другие зависящие черты, решал проблему. Пример определения другой черты в зависимости от 'Trait': ' trait NewTrait: Trait {...} ' Однако я буду ждать другого решения, на случай, если кто-то другой не сможет использовать' Self' в определениях признаков , –
Otobo
Я добавил другое решение, используя связанные типы. –