rust和 c 一样,不是一个面向对象的语言,没有class,只有struct,声明一个struct
#[derive(Debug)]struct Config {query: String,filename: String,case_sensitive: bool,}impl Config {fn new(query: String) -> Result<Self, &'static str> {if query.len() <= 0 {return Err("invalid argument");}Ok(Self{query, filename: String::from("test"), case_sensitive: false})}}
fn main() {let cfg = Config::new(String::from("query")).unwrap_or_else(|err| {eprintln!("failed to create config {}", err);process::exit(1)});println!("{:?}", cfg);}
Config::new 类似一个静态方法,new方法没有应用到 Config的实例,如果要添加一个实例方法就需要这样定义
impl Config {fn get_query(self) -> &String {&self.filename}}
这里 get_query 与 new 可以不再一个impl block里
这样就可以通过cfg调用函数
fn main() {let cfg = Config::new(String::from("query")).unwrap_or_else(|err| {eprintln!("failed to create config {}", err);process::exit(1)});println!("{:?}", cfg);println!("{:?}", cfg.get_query());}
注意这里 get_query 的入参是 &self, 是一个引用,如果这里去掉引用,那么意思就是self作为入参被move进了get_query函数,在get_query函数结束后,会被释放,也就是说当调用了 get_query后,如果再调用cfg就会编译报错了
