«Ожидаемый параметр типа, найдено целое число» при вызове из функции, но не при вызове из основного - PullRequest
0 голосов
/ 12 января 2020
struct Cache<T> {
    key: String,
    val: T
}

impl<T> Cache<T> {
    fn new(k: String, v: T) -> Cache<T> {
        Cache { key: k, val: v }
    }

    fn update(&mut self, v: T) {
        self.val = v;
    }
}

fn increment<T>(cache: &mut Cache<T>, v: T) {
    cache.update(v);
}

fn main() {
    let mut c = Cache::new("akshay".to_string(), 21);
    c.update(25);
    println!("c = {}", c.val);
    increment(&mut c, 30);
    println!("c = {}", c.val);
}

Этот пример отлично работает. Но если я изменяю cache.update(v); на cache.update(25); в функции increment, я получаю следующую ошибку:

cache.update(25);
|            ^^ expected type parameter, found integer
|
= note: expected type `T`
          found type `{integer}`
= help: type parameters must be constrained to match other types

Итак, мой вопрос, почему метод cache.update(25) работает из main функция, но не из increment функция?

1 Ответ

2 голосов
/ 12 января 2020

Поскольку в main компилятор знает, что имеет дело с Cache с целочисленным типом в качестве параметра типа. Однако в функции increment можно передать Cache любого типа generi c, поскольку вы принимаете Cache<T> в качестве параметра. Таким образом, если вы все еще пытаетесь вызвать update с целочисленным аргументом для Cache<T>, это будет проблемой, и поэтому компилятор не разрешит этого. Например, если increment вызывается с Cache<String> в качестве аргумента, как будет работать cache.update(25)?

Если вы, например, sh работаете только с Cache<i32>, вы можете ограничить тип параметра вашей increment функции:

fn increment(cache: &mut Cache<i32>, v: i32)

в противном случае в версии функции generi c вам придется использовать только значения типа T, и вы не сможете делать такие вещи, как cache.update(25)

...