当前位置: 首页 > article >正文

【Rust】快速教程——自定义类型、数字转枚举、Cargo运行

前言

超过一定的年龄之后,所谓人生,无非是一个不断丧失的过程而已。宝贵的东西,会像梳子豁了齿一样从手中滑落下去。你所爱的人会一个接着一个,从身旁悄然消逝。——《1Q84》


         \;\\\;\\\;

目录

    • 前言
    • 自定义类型
    • 数字转枚举
      • Cargo.toml
      • main.rs

自定义类型

RUST中没有类,只有结构体。通过实现在结构体中实现固定名称的接口(这个就类似类),接口中有几个固定的函数。

!表示发散函数,可以转换为各种类型

use std::{fmt::Display,ops::Add};





//定义一个"包裹"
struct Wrapper(Vec<String>);    //Vec是矢量数组

//为结构体实现接口,而不是实现结构体!!!
//接口名Display是固定的
impl Display for Wrapper{
    fn fmt(&self, f :&mut std::fmt::Formatter<'_>) -> std::fmt::Result{
        write!(f,"[{}]",self.0.join(", "))   //要返回的,不要分号
    }
}






//定义一个"工具"
struct Tool(u32);

//为结构体实现接口,而不是实现结构体!
//接口名Display是固定的
impl Display for Tool{
    fn fmt(&self,f :&mut std::fmt::Formatter<'_>)->std::fmt::Result{
        write!(f,"{}",self.0)  //要返回的,不要分号
    }
}
//为结构体实现接口,而不是实现结构体!
//接口名Add是固定的
impl Add for Tool{
	//type是重命名
    type Output = Self;

    //左边的self是参数,右边的other是固定成Add类型的参数
    fn add(self,other:Self) -> Self{
        Self(self.0+other.0)
    }
}




fn my_add(a:Tool,b:Tool)->Tool{
    a+b    //add函数先前被重载了
}




fn main(){
    //vec![] = Vec::new()
    let a = Wrapper(vec![
        String::from("hello"),
        String::from("world"),
        String::from("hola"),
        String::from("mundo")
    ]);
    println!("a={}",a);


    let a = my_add(
        Tool(10),
        Tool(11)
    );
    println!("a={}",a);

	
    type Tool_t = u32;
    let b:u32=1;
    let c:Tool_t=2;
    println!("{}+{}={}",b,c,b+c);
}

在这里插入图片描述

         \;\\\;\\\;

数字转枚举

Cargo.toml

安装两个包,需要用cargo下载。cargo的目录如下:
在这里插入图片描述
main.rs放在src中,Cargo.toml与src同一层,运行的时候进入proj就行了。

使用 cargo run 运行

在这里插入图片描述

Cargo.toml文件

[package]
name="enumToInt"
version="0.1.0"
edition="2021"

[dependencies]
num-traits ="0.2.14"
num-derive ="0.3.3"

[registries]
ustc={ index="https://mirrors.ustc.edu.cn/crates.io-index" }

main.rs

main.rs文件

use num_traits::FromPrimitive;
use num_derive::FromPrimitive;


#[derive(FromPrimitive)]
enum Person{
    Student=1,
    Teacher,
    Staff
}

fn main(){
    //枚举转数字
    let a=Person::Teacher as u32;

    //数字转枚举
    match FromPrimitive::from_u32(a){
        Some(Person::Student) => println!("[Student]"),
        Some(Person::Teacher) => println!("[Teacher]"),
        Some(Person::Staff) => println!("[Staff]"),
        None => println!("[None]"),
    }
}

错误:下载还没一半就warning没完没了了


http://www.kler.cn/a/148901.html

相关文章:

  • 使用Python实现对接Hadoop集群(通过Hive)并提供API接口
  • opencv常用api
  • 前端垂直居中的多种实现方式及应用分析
  • Nuxt 版本 2 和 版本 3 的区别
  • 【Golang】Channel的ring buffer实现
  • 【软件工程】一篇入门UML建模图(类图)
  • ArrayList与顺序表的简单理解
  • JSP forEach标签varStatus使用讲解(了解即可 基本用不到)
  • Day 12 周日和周一
  • 【LeetCode】挑战100天 Day12(热题+面试经典150题)
  • CSS逻辑组合伪类
  • ArrayList 和 HashMap 源码解析
  • MFC mysql 往数据库中写路径时,斜杠消失
  • Axios 并发请求指南 - 3 种简单实用的方法
  • 深入Android S (12.0) 探索Framework之输入系统IMS的构成与启动
  • linux下ffmpeg安装
  • 2023极客大挑战-AGRT战队wp
  • 多线程(补充知识)
  • [nlp] tokenizer
  • 与中通支付对接
  • 前端 vue 面试题(二)
  • leaflet对线设置渐变色
  • LLM大语言模型
  • 深入redis过程-命令
  • 代码随想录算法训练营第四十九天【动态规划part10】 | 121. 买卖股票的最佳时机、122.买卖股票的最佳时机II
  • Android:从源码看FragmentManager如何工作