画板

变量与函数

  • rust支持类型推导,在编译器能够推导类型的情况下,变量类型一般可以省略(例如像java中我们也可用var关键字来做变量定义),但常量(const)和静态变量(static)必须声明类型。
  • 函数是一等公民,可以作为参数或者返回值
  1. fn add(x: i32, y: i32) -> i32 {
  2. x + y
  3. }
  4. fn sub(x: i32, y: i32) -> i32 {
  5. x - y
  6. }
  7. fn div(x: i32, y: i32) -> i32 {
  8. x / y
  9. }
  10. fn mul(x: i32, y: i32) -> i32 {
  11. x * y
  12. }
  13. // rust不用显式return
  14. fn operate(x: i32, y: i32, f: fn(i32, i32) -> i32) -> i32 {
  15. f(x, y)
  16. }
  17. fn str_func(str: String) -> fn(i32, i32) -> i32 {
  18. match str.as_str() {
  19. "+" => add,
  20. "-" => sub,
  21. "*" => mul,
  22. "/" => div,
  23. _ => add
  24. }
  25. }
  26. fn main() {
  27. let xf = String::from("+");
  28. let x1 = operate(1, 2, str_func(xf));
  29. println!("({} + {}) = {}", 1, 2, x1);
  30. let x2 = operate(2, 3, sub);
  31. println!("({} - {}) = {}", 1, 2, x2);
  32. }
这里 fn(i32, i32) -> i32 是operate的第三个参数,是一个函数。fn(i32, i32) -> i32 是str_func的返回值。 Rust 函数参数的类型和返回值的类型都必须显式定义,如果没有返回值可以省略,返回 unit即为()。函数内部如果提前返回,需要用 return 关键字,否则最后一个表达式就是其返回值。如果最后一个表达式后添加了; 分号,隐含其返回值为 unit即为()。
  1. // 无申明,默认最后一行 无; 则为返回值,加了; 即无返回值
  2. fn pi() -> f64 {
  3. 3.141592653589793238
  4. }
  5. // 可以显示申明return
  6. fn pi_show() -> f64 {
  7. return pi()
  8. }
  9. fn pi_none() {
  10. 3.141592653589793238;
  11. }
  12. fn pi_none1() -> () {
  13. 3.141592653589793238;
  14. }
  15. fn test_fun_return() {
  16. let pai: f64 = pi_show();
  17. println!("{}", pai);
  18. let xx: () = pi_none();
  19. let xx1: () = pi_none1();
  20. }

数据结构

  1. // 性别枚举
  2. enum Sex {
  3. None = 0, // 未知的
  4. Man = 1, // 男
  5. Woman = 2, // 女
  6. }
  7. struct User {
  8. id: i64, // 用户id
  9. name: String, // 用户名称
  10. sex: Sex, // 性别
  11. }
  12. struct UserTopic {
  13. id: i64, // 用户队列id
  14. name: String, // 用户队列名称
  15. owner: i64, // 用户id
  16. }
  17. enum MessageType {
  18. None = 0, // 未知
  19. Text = 1, // 文本
  20. Emoji = 2, // 表情
  21. RedEnvelope = 3, // 红包
  22. Image = 4, // 图片
  23. }
  24. /**
  25. * 元组结构体
  26. * 没有字段名称,通过 . 和下标来进行访问:
  27. */
  28. struct Message(MessageType, String);
  29. // Event:标准的标签联合体,它定义了三种事件:Join、Leave、Message。每种事件都有自己的数据结构。
  30. enum Event{
  31. // 元组结构体
  32. Join(i64, i64), // i64[用户id], i64[topicid]
  33. Leave(i64, i64), // i64[用户id], i64[topicid]
  34. SendMessage(i64, i64, Message), // i64[用户id], i64[topicid], Message[消息]
  35. }
  36. fn test_data_struct() {
  37. let user1 = User { id: 1, name: "user1".into(), sex: Sex::Man };
  38. let user1_topic = UserTopic { id: 1, name: "/chat/user1/topic".into(), owner: user1.id };
  39. let user2 = User { id: 2, name: "user2".into(), sex: Sex::Woman };
  40. let user2_topic = UserTopic { id: 2, name: "/chat/user2/topic".into(), owner: user2.id };
  41. let event1 = Event::Join(user1.id, user1_topic.id);
  42. let event2 = Event::Join(user2.id, user2_topic.id);
  43. // 发给 user1 一条消息的事件
  44. let event3 = Event::SendMessage(user1.id, user1_topic.id, Message(MessageType::Text, "hello rust!".into()));
  45. }