繁体   English   中英

Rust 中的 Generics:: 不匹配的类型预期 struct `Token<'_, T>` 找到 struct `Token<'_, i32>

[英]Generics in Rust :: mismatched types expected struct `Token<'_, T>` found struct `Token<'_, i32>

我对返回类型有疑问。 抱歉代码错误。 我正在学习Rust,没有找到这个问题的答案。 我也尝试了 Rust 这本书,但没有成功。

错误:预期类型不匹配 struct Token<'_, T>找到 struct Token<'_, {integer}>

代码:

    struct Token<'a, T: 'a> {
        token_type: &'a str,
        value e: T,
    }
 
    impl<'a, T> Token<'a, T> {
      pub fn new(ttype: &'a str, value: T) -> Token<'a, T> {
        Token {
            token_type: ttype,
            value,
        }
      }
    }

    struct Lexer<'a> {
        input_code: &'a str,
        pos: i32,
        current_char: String,
    }

    impl<'a> Lexer<'a> {
        pub fn get_next_token<T>(&self) -> Token<T> {
            while self.current_char != EOF {
 
                if self.current_char == SPACE {
                    self.skip_whitespace();
                    continue;
                }
    
                if DIGITS.to_owned().contains(&self.current_char) {
                    let number: i32 = self.create_integer();
                    let token = Token::new(INTEGER, number);
                    return token;
                }

                if self.current_char == "+" {
                    self.advace();
                    let token = Token::new(SUM, "+");
                    return token;
                }
            }

            let token = Token::new(EOF, 0);
            token
        }

...more code

你的 function 说它会返回一个Token<T>

在此块中,您返回一个Token<i32> (这是错误消息的来源)。

if DIGITS.to_owned().contains(&self.current_char)
    let number: i32 = self.create_integer();
    let token = Token::new(INTEGER, number);
    return token;
}

在这个块中,您返回一个Token<&'static str>()

if self.current_char == "+" {
    self.advace();
    let token = Token::new(SUM, "+");
    return token;
}

这些都不符合您的返回类型Token<T> 这确实表明您的 function 可以返回调用者想要的任何T的令牌。 这是一份很难履行的契约!

这个问题的解决方案可能是从Token<T>中删除泛型,而是对所有可能的 Tokens 进行enum (看起来你已经接近token_type字段的这个想法)。 然后,您的get_next_token function 将只返回一个Token ,调用者必须弄清楚 Token 实际包含的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM