rust和 c 一样,不是一个面向对象的语言,没有class,只有struct,声明一个struct

    1. #[derive(Debug)]
    2. struct Config {
    3. query: String,
    4. filename: String,
    5. case_sensitive: bool,
    6. }
    7. impl Config {
    8. fn new(query: String) -> Result<Self, &'static str> {
    9. if query.len() <= 0 {
    10. return Err("invalid argument");
    11. }
    12. Ok(Self{query, filename: String::from("test"), case_sensitive: false})
    13. }
    14. }
    1. fn main() {
    2. let cfg = Config::new(String::from("query")).unwrap_or_else(|err| {
    3. eprintln!("failed to create config {}", err);
    4. process::exit(1)
    5. });
    6. println!("{:?}", cfg);
    7. }

    Config::new 类似一个静态方法,new方法没有应用到 Config的实例,如果要添加一个实例方法就需要这样定义

    1. impl Config {
    2. fn get_query(self) -> &String {
    3. &self.filename
    4. }
    5. }

    这里 get_query 与 new 可以不再一个impl block里

    这样就可以通过cfg调用函数

    1. fn main() {
    2. let cfg = Config::new(String::from("query")).unwrap_or_else(|err| {
    3. eprintln!("failed to create config {}", err);
    4. process::exit(1)
    5. });
    6. println!("{:?}", cfg);
    7. println!("{:?}", cfg.get_query());
    8. }

    注意这里 get_query 的入参是 &self, 是一个引用,如果这里去掉引用,那么意思就是self作为入参被move进了get_query函数,在get_query函数结束后,会被释放,也就是说当调用了 get_query后,如果再调用cfg就会编译报错了