首页 > 其他分享 >Rust简易入门(三)

Rust简易入门(三)

时间:2024-03-30 16:45:24浏览次数:20  
标签:入门 numbers i32 简易 let fn println Rust 函数

Rust的流程控制主要包括条件语句(if、else、else if)、循环语句(for、while)和跳转语句(break、continue、return)。这些语句使程序员能够根据特定的条件或循环执行代码块,从而实现各种复杂的逻辑控制。例如,if语句允许程序员根据条件执行代码,而for和while循环则用于重复执行代码块,直到满足特定的条件。

if流程控制与match模式匹配

fn main() {
    let age = 50;
    if age < 50 {
        println!("你还年轻");
    } else {
        println!("你老了");
    }
    
    let num = 90;
    match num {
        80..=89 => println!("80 .. =89"),
        90 => println!("90"),
        95|100 => println!("95 | 100"),
        _ => println!("some else")
    }
    
}

循环与break continue以及与迭代的区别

fn main(){
    // loop {
    //     println!("Ctrl+C");
    //     std::thread::sleep(std::time::Duration::from_secs(1));
    // }
    
    'outer: loop {
        println!("outer");
        loop {
            println!("inner");
            break 'outer;
        }
    }
    
    // 循环的写法
    let numbers = [1, 2, 3, 4, 5];
    let mut for_numbers = Vec::new();
    for &number in numbers.iter() {
        let item = number * number;
        for_numbers.push(item);
    }
    println!("for : {:?}", for_numbers);
    
    // 迭代器的写法
    let numbers = [1,2,3,4,5].to_vec();
    let iter_number: Vec<_> = numbers.iter().map(|&x| x*x).collect();
    println!("for : {:?}", iter_number);
}

函数基础与Copy值传递

函数的定义:在Rust中函数的关键字为fn

参数与返回值:函数可以接受零个或者多个参数,每个参数都需要指定类型,函数可以有返回值,使用 指定返回值类型,若无返回值可以使用 →()或者省略

如果数据类型实现Copy特质,则在函数传参时会实现Copy by value

Struct、美剧、集合等并没有实现Copy特质,会实现move操作失去所有权

fn add(x: i32, y: i32) -> i32 {
    x + y
}

fn change_i32(mut x: i32) {
    x += 4;
    println!("{x}");
}

fn modify_i32(x: &mut i32){
    *x += 5;
}


#[derive(Copy, Clone)]
struct Point{
    x: i32,
    y: i32,
}

fn print_point(point: Point){
    println!("point x {}", point.x);
}

fn main() {
    let a = 1;
    let b = 2;
    let c = add(a, b);
    println!("{c}");
    
    let mut x = 1;
    change_i32(x);
    println!("x {x}");
    modify_i32(&mut x);
    println!("x {x}");
    
    let s = Point{x: 1, y: 2};
    print_point(s); // move
    println!("point y {}", s.y);
}

函数值参数传递、不可变借用参数传递、可变借用参数传递

fn move_func(p1: i32, p2: String) {
    println!("p1 is {}", p1);
    println!("p2 is {}", p2);
}

fn print_value(value: &i32) {
    println!("{}", value);
}

fn string_func_borrow(s: &String) {
    println!("{}", (*s).to_uppercase());
}

#[derive(Debug)]
struct Point {
    x: i32,
    y: i32,
}

fn modify_point(point: &mut Point) {
    (*point).x += 2;
    point.y += 2;
}

fn main() {
    let n = 12;
    let s = String::from("00");
    move_func(n, s);
    println!("{}", n);
    
    let s = String::from("oo");
    print_value(&n);
    print_value(&n);
    string_func_borrow(&s);
    println!("s is {}", s);
    
    let mut p = Point{x: 0, y: 0};
    println!("{:?}", p);
    modify_point(&mut p);
    println!("{:?}", p);
}

函数返回值与所有权机制

函数的返回值分为:返回值类型、返回引用类型

  1. 返回值类型 Copy与 Non-Copy

都可以返回,Non-Copy分配在堆上

返回Copy类型的值通常具有更好的性能,Copy类型的值是通过复制来进行返回,不涉及堆上内存的分配和释放,通常是在栈上分配

  1. 返回引用

在只有传入一个引用参数且只有一个返回引用时,生命周期不需要声明

其他状况需要标注生命周期

慎用 'static

fn func_copy_back() -> i32 {
    let n = 53;
    n
}

fn func_non_copy_back() -> String { // 栈上分配
    let s = String::from("hello");
    s
}

fn get_mess(mark: i32) -> &'static str {
    if mark == 0 {
        "

标签:入门,numbers,i32,简易,let,fn,println,Rust,函数
From: https://www.cnblogs.com/moguw/p/18105699

相关文章

  • 数学入门——均值不等式 学习笔记
    数学入门——均值不等式学习笔记简化形式若\(a,b>0\),则:\[\dfrac{2}{\dfrac{1}{a}+\dfrac{1}{b}}\le\sqrt[2]{ab}\le\dfrac{a+b}{2}\le\sqrt[2]{\dfrac{a^2+b^2}{2}}\]理解方式:https://www.bilibili.com/video/BV1Nf4y1G7xV基本形式若\(a,b>0\),则:\[\dfrac{n}{\dfrac{......
  • 天体力学——天体运动入门 学习笔记
    天体力学——天体运动入门学习笔记一、开普勒三大定律开普勒第一定律(椭圆定律、轨道定律)行星绕太阳的轨迹是椭圆轨道,太阳在椭圆的一个焦点上。开普勒第二定律(等面积定律)在相等时间内,行星与太阳的连线扫过的面积相等。结论:近日点速度较大,远日点速度较小。开普勒第三定律(周......
  • Rust简易入门(一)
    Rust!Rust!Rust!变量与不可变性在Rust中,变量使用let关键字进行声明Rust支持类型推导,也可以显示指定变量类型变量名采用蛇形命名法,枚举结构体采用帕斯卡命名法,没有使用的变量采用前置下划线_以消除警告强制类型转换关键词as打印变量println!("val:{}",x);print......
  • Vue+OpenLayers7入门到实战:OpenLayers涂鸦手绘线条、圆形和多边形,涂鸦线条自动收尾连
    返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7入门到实战前言本章介绍如何使用OpenLayers7在地图上进行绘制图形的功能,上一章中《Vue+OpenLayers7入门到实战:OpenLayers图形绘制功能,OpenLayers实现在地图上绘制线段、圆形和多边形》我们已经讲过多种图形的绘制,本章主要......
  • python入门教程(非常详细),从零基础入门到精通,看完这一篇就够了
    前言本文罗列了了python零基础入门到精通的详细教程,内容均以知识目录的形式展开。01.python由来与发展介绍02.项目开发流程第一章markdown编辑器01.markdown基本语法02.Typora简介与安装03.Windows上gitee+Typora设置图床04.macOS上gitee+Typora设置图床第二章计......
  • 嵌入式开发学习笔记1——keil软件入门
    学习笔记(2024.3.30)引言从对几个问题的思考入手:1、keil是什么?干什么用的?有什么优点?2、keil从哪里下载?怎么安装?3、keil学习路线图怎么比较合理?学习的顺序?4、怎么快速用起来?1、keil是什么?干什么用的?有什么优点?keil软件介绍Keil是一款单片机开发环境,主要研发8051微控制器......
  • Kubernetes超详细教程,一篇文章帮助你从零开始学习k8s,从入门到实战
    k8s概述k8sgithub地址:https://github.com/kubernetes/kubernetes官方文档:https://kubernetes.io/zh-cn/docs/home/k8s,全程是kubernetes,这个名字源于希腊语,意为"舵手"或"飞行员”k8s这个缩写是因为k和s之间有八个字符Google在2014年开源了k8s项目,k8s是一个......
  • SVG XML 格式定义图形入门介绍
    SVGSVGmeansScalableVectorGraphics.SVG使用XML格式定义图形SVG图像在放大或改变尺寸的情况下其图形质量不会有所损失SVG是万维网联盟的标准HelloWorldUseSVGinhtmlandyoucansee:LinktotheSVGfileYoucanuse<a>tagtolinktothes......
  • 1.java openCV4.x 入门-环境搭建
    专栏简介......
  • 【C++】C到C++的入门知识
    目录1、C++关键字2、命名空间2.1命名空间的定义2.2命名空间的使用2.2.1 加命名空间名称及作用域限定符2.2.2使用using将命名空间中某个成员引入2.2.3使用usingnamespace命名空间名称引入3、C++输入&输出4、缺省参数 4.1缺省参数的概念4.2缺省参数的分类......