变量与函数
- rust支持类型推导,在编译器能够推导类型的情况下,变量类型一般可以省略(例如像java中我们也可用var关键字来做变量定义),但常量(const)和静态变量(static)必须声明类型。
- 函数是一等公民,可以作为参数或者返回值
这里 fn(i32, i32) -> i32 是operate的第三个参数,是一个函数。fn(i32, i32) -> i32 是str_func的返回值。 Rust 函数参数的类型和返回值的类型都必须显式定义,如果没有返回值可以省略,返回 unit即为()。函数内部如果提前返回,需要用 return 关键字,否则最后一个表达式就是其返回值。如果最后一个表达式后添加了; 分号,隐含其返回值为 unit即为()。
fn add(x: i32, y: i32) -> i32 {
x + y
}
fn sub(x: i32, y: i32) -> i32 {
x - y
}
fn div(x: i32, y: i32) -> i32 {
x / y
}
fn mul(x: i32, y: i32) -> i32 {
x * y
}
// rust不用显式return
fn operate(x: i32, y: i32, f: fn(i32, i32) -> i32) -> i32 {
f(x, y)
}
fn str_func(str: String) -> fn(i32, i32) -> i32 {
match str.as_str() {
"+" => add,
"-" => sub,
"*" => mul,
"/" => div,
_ => add
}
}
fn main() {
let xf = String::from("+");
let x1 = operate(1, 2, str_func(xf));
println!("({} + {}) = {}", 1, 2, x1);
let x2 = operate(2, 3, sub);
println!("({} - {}) = {}", 1, 2, x2);
}
// 无申明,默认最后一行 无; 则为返回值,加了; 即无返回值
fn pi() -> f64 {
3.141592653589793238
}
// 可以显示申明return
fn pi_show() -> f64 {
return pi()
}
fn pi_none() {
3.141592653589793238;
}
fn pi_none1() -> () {
3.141592653589793238;
}
fn test_fun_return() {
let pai: f64 = pi_show();
println!("{}", pai);
let xx: () = pi_none();
let xx1: () = pi_none1();
}
数据结构
// 性别枚举
enum Sex {
None = 0, // 未知的
Man = 1, // 男
Woman = 2, // 女
}
struct User {
id: i64, // 用户id
name: String, // 用户名称
sex: Sex, // 性别
}
struct UserTopic {
id: i64, // 用户队列id
name: String, // 用户队列名称
owner: i64, // 用户id
}
enum MessageType {
None = 0, // 未知
Text = 1, // 文本
Emoji = 2, // 表情
RedEnvelope = 3, // 红包
Image = 4, // 图片
}
/**
* 元组结构体
* 没有字段名称,通过 . 和下标来进行访问:
*/
struct Message(MessageType, String);
// Event:标准的标签联合体,它定义了三种事件:Join、Leave、Message。每种事件都有自己的数据结构。
enum Event{
// 元组结构体
Join(i64, i64), // i64[用户id], i64[topicid]
Leave(i64, i64), // i64[用户id], i64[topicid]
SendMessage(i64, i64, Message), // i64[用户id], i64[topicid], Message[消息]
}
fn test_data_struct() {
let user1 = User { id: 1, name: "user1".into(), sex: Sex::Man };
let user1_topic = UserTopic { id: 1, name: "/chat/user1/topic".into(), owner: user1.id };
let user2 = User { id: 2, name: "user2".into(), sex: Sex::Woman };
let user2_topic = UserTopic { id: 2, name: "/chat/user2/topic".into(), owner: user2.id };
let event1 = Event::Join(user1.id, user1_topic.id);
let event2 = Event::Join(user2.id, user2_topic.id);
// 发给 user1 一条消息的事件
let event3 = Event::SendMessage(user1.id, user1_topic.id, Message(MessageType::Text, "hello rust!".into()));
}