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就会编译报错了