
变量与函数
- 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不用显式returnfn 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}// 可以显示申明returnfn 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, // 用户idname: String, // 用户名称sex: Sex, // 性别}struct UserTopic {id: i64, // 用户队列idname: 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()));}
