抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

命名

方法命名

类型应为首字母大写的驼峰命名法(UpperCamelCase),

枚举变量应为首字母大写的驼峰命名法(UpperCamelCase),

结构体字段应使用纯小写下划线命名法(snake_case),

函数和方法名称应使用纯小写下划线命名法(snake_case),

局部变量应为纯小写下划线命名法(snake_case),

宏名称应为纯小写下划线命名法(snake_case),

常量(常量和不可变静态)应使用纯大写下划线命名(SCREAMING_SNAKE_CASE)

当名称是保留字(如 crate)而禁止使用时,要么使用原始标识符(r#crate),要么使用尾部下划线(crate_)——不要拼错单词 (krate)。

类型

Result

1
2
3
4
5
6
7
8
9
10
fn main()->Result<()>{
let listener=TcpListener::bind("127.0.0.1:11451")?;
for stream in listener.incoming(){
match stream{
Ok(T)=>tcp_handler(T),
Err(e)=>println!("Error:{}",e)
};
}
Ok(())
}

请观察以上代码块,会报错。

原因在于std::result::Result这个泛型类型有如下签名:

Result<T, E>

需要两个泛型参数,而我只给了一个。

但我看别人这么写并没有报错,

仔细比较了一下,我发现rust的std中有好几种Result,如std::result::Resultstd::fmt::Resultstd::io::Resultstd::thread::Result

其中用得比较多的是std::io::Result,签名如下:

1
pub type Result<T> = Result<T, Error>;

它是I/O 操作的专用 Result 类型,但用处广泛,因为只要传一个参数。刚才的问题代码修改成这样可以运行:

1
2
3
4
5
6
7
8
9
10
fn main()->std::io::Result<()>{     // changes here
let listener=TcpListener::bind("127.0.0.1:11451")?;
for stream in listener.incoming(){
match stream{
Ok(T)=>tcp_handler(T),
Err(e)=>println!("Error:{}",e)
};
}
Ok(())
}

评论

留下神评妙论