【Rust】速度入门---打印个螃蟹先

news2025/4/23 9:44:48

参考: 菜鸟教程

1 输出到命令行

这不得打印个螃蟹

// 代码来自官方入门教程
// ferris_say需要另外安装
use ferris_says::say;
use std::io::{stdout, BufWriter};

fn main() {
    let stdout: std::io::Stdout = stdout();
    let msg: String = String::from("Hello fellow Rustaceans!");
    let width: usize = msg.chars().count();
    let mut writer: BufWriter<std::io::StdoutLock> = BufWriter::new(stdout.lock());
    say(msg.as_bytes(), width, &mut writer).unwrap();

}

cargo run 查看螃蟹。它叫Ferris,乃Rust社区的吉祥物。

在这里插入图片描述

老规矩打印“Hello world!”
这就需要用到print!( )println!( )两个宏规则
println!( )输出后会换行但print!( )不会
提到输出就不得不提格式化字符串了,Rust的占位符{}

fn main() {
    let msg: &str = "Hello world!";
    println!("Hello world!");
    // {}内填数字,把格式字符串之后的可变参数当数组来用(下标也是从零开始)
    print!("{0}, {0}", msg);    // 格式化字符串
    print!(" Very good!");
}

在这里插入图片描述

2 变量

2.1 不可变的变量

Rust是强类型语言,但具有自动判断变量类型的能力

声明变量,需要 let(写JavaScript的时候用过诶)
单单使用个 let 声明的变量,被官方称为"不可变变量"

  • 在确定变量类型后,不能把其他类型的值赋给它
  • Rust不允许精度有损失的自动数据类型转换
  • 记住了!!!这是它是“不可变变量”
//虽然Rust会自动判断变量类型但是手动加上比较好
//整型默认是 32位,手动写成 64位,变量取值范围大大的不一样
let hell: i32 = 234;
let hell: i64 = 1234;

let msg: &str = "Hello hell!";

只需要加一个 mut 就能是”不可变变量“可变啦

fn main() {
    let mut msg: &str = "Hello world!";    //①
    // print!("{}", msg);
    msg = "Hello hell!";
    print!("{0}, {0}", msg);    //②
    print!(" Very good!");
}

上面的代码运行后会出现警告

warning: value assigned to msg is never read
说是①位置的 msg 的值永远无法读取到。因为在打印之前修改了它的值,这样变量最开始的值就访问不到了,把注释取消,警告就会消失

2.2 常量和不可变变量的区别

下面代码在Rust中是合法,但是①位置的hell未被使用,所以会有警告
warning: unused variable: hell
这里操作叫重影

fn main() {
    let hell: i32 = 123;    // ①
    let hell: i32 = 234;    // ②
    print!("{}", hell);
}

但是如果是常量,那就不行了,得报错了
error[E0005]: refutable pattern in local binding

//这么写是错误的
fn main() {
    const hell: i32 = 123;
    let hell: i32 = 234;
    print!("{}", hell);
}

2.3 重影

变量名可以重新使用的机制
和其他语言的“重写”或“重载”是不一样的

重影是指用同一个名字重新代表另一个变量实体,其类型、可变属性和值都可以改变。
可变变量赋值就不一样了,赋值只能改变值

这样整是会报错的
error[E0308]: mismatched types

fn main() {
    let mut welcome: &str = "Hello hell";
    let len: i32 = welcome.len().try_into().unwrap();
    println!("The length of welcome is {}", len);
    welcome = welcome.len();
    println!("The length of welcome is {}", welcome);
}

这个是会Rust不会帮你自动转换类型,需要解锁
可以使用 as 或者 try_into

fn main() {
    let welcome: &str = "Hello hell";
    //len()返回的是usize
    //let len: i32 = welcome.len() as i32;
    let len: i32 = welcome.len().try_into().unwrap();
    println!("The length of welcome is {}", len);
}
// The length of welcome is 10

2.4 数据类型

整数型 整数还能加下划线

//这是合法的
let a: i32 = 199_0000;
let a: i32 = 199_0_0_0;
//写成这样也没毛病,不过加下划线是为更容易判断数据大概多大的

在这里插入图片描述

浮点型32位浮点数(f32)和64位浮点数(f64
我的电脑是默认64位的

布尔型 truefalse

字符串 char

一些简单的数学运算
rust不支持自增自减(++, --)

fn main() {
    let mut sum: i32 = 5 + 10;
    println!("{}", sum);
    sum += 1;
    let dif: f64 = 9.5 - 1.2;
    let mul: i32 = 7 * 10;
    let rem: i32 = 43 % 3;

    println!("{}, {}, {}, {}", sum, dif, mul, rem);
}
//15
//16, 8.3, 70, 1

复合类型 元组 () 数组 []

let msg = ['H'; 5];
//等价于let msg = ['H', 'H', 'H', 'H', 'H'];
let ele = msg[0];
println!("{}", ele);
let array: [[i32; 3]; 2] = [[1,2,3], [3,4,2]];
println!("{}", array[0][0]);

3 函数

fn <函数名> (<参数>) <函数体>
函数体表达式不能使用 return

fn main() {
    let y = {    // 表达式块 函数体表达式
        let x = 4;
        x + 2    // 表达式, 它的结果是整个表达式所代表的值
    };
    //嵌套的函数
    //跟Python的挺像的, 不过Python就一个样子在哪
    fn print_var(var: i32) -> i32 {
        // print!("OK... ");
        // var + 2
        return var + 2;
    }
    print(print_var(y));
    print(y);
    println!("Value of y is {}", y);
}

fn print(x: i32) {
    // println!("Hello, world!");
    println!("{}", x);
}

4 条件

条件不需要向C语言一样加 ()

fn main() {
    let msg: &str = "hello";
    let _msg_other: &str;

    if msg == "hello" {
        _msg_other = "hell";
    }
    else if  msg == "Hello"{
        _msg_other = "Boom";    // 如果注释这句,将会报错
        // _msg_other可能会未初始化
        println!("HHHH");
    }
    else {
        _msg_other = "world";
    }
    println!("{}, {}", msg, _msg_other);
}

条件表达式必须是bool类型

fn main() {
    let number = 3;
    if number {
        // 报错,expected `bool`, found integerrustc(E0308)  
        println!("Yes");
    }
}

可以实现类似三元条件运算表达式(A?B:C)的效果
{}中的表达式必须是同一类型不然会报错
error: if and else have incompatible types
少了else{} 也会报错的
error: if may be missing an else clause
if expressions without else evaluate to ()

fn main() {
    let r = 3;
    let msg = if r > 0 { "Hello hell!" } else { "haha" };
    println!("{}", msg);
}

5 循环

5.1 while

fn main() {
    let mut index: i32 = 0;
    // let mut index: usize = 0;
    let msg: [&str; 4] = ["Hell", "Hello", "World", "Judy"];
    while index != 4 {
	    // 下标的类型必须是 usize
        println!("{}", msg[index as usize]);
        index += 1;
    }
    println!("EXIT");
}

运行结果:

Hell
Hello
World
Judy
EXIT

5.2 for

for 循环是最常用的循环结构,常用来遍历一个线性数据结构

fn main() {
    let msg: [&str; 4] = ["Hell", "Hello", "World", "Judy"];
    // msg.iter 表示是 msg的迭代器
    for i in msg.iter() {
        println!("{}", i);
    }
}
fn main() {
    let msg: [&str; 4] = ["Hell", "Hello", "World", "Judy"];
    for i in 0..4 {
        println!("msg[{}] = {}", i, msg[i]);
    }
}

运行结果:

msg[0] = Hell
msg[1] = Hello
msg[2] = World
msg[3] = Judy

5.3 loop

Rust 语言有原生的无限循环结构

fn main() {
    let msg = ["Hell", "Hello", "World", "Judy", "EOF"];
    let mut i: usize = 0;
    loop {
        let str: &str = msg[i];
        if str == "EOF" {
            break i;
        }
        println!("msg[{}] = {}", i, str);
        i += 1;
    };
}

运行结果:

msg[0] = Hell
msg[1] = Hello
msg[2] = World
msg[3] = Judy

loop 循环可以通过 break 关键字类似于 return 一样使整个循环退出并给予外部一个返回值。因为 loop 这样的循环常被用来当作查找工具使用,如果找到了某个东西当然要将这个结果交出去

fn main() {
    let msg = ["Hell", "Hello", "World", "Judy", "EOF"];
    let mut i: usize = 0;
    let location: usize = loop {
        let str: &str = msg[i];
        if str == "EOF" {
            break i;
        }
        i += 1;
    };
    println!("\"BOF\" 的索引是 {}", location);
}

运行结果:

"BOF" 的索引是 4

6 所有权

所有权规则

  • Rust 中的每个值都有一个变量,称为其所有者。
  • 一次只能有一个所有者。(某段内存只能被最后的变量名所有,前面声明过的变量都作废,这有效的避免被多个变量释放的问题,而且该操作是在编译期就可以检查到的,这策略可在编译期就能有效的避免空指针问题。)
  • 当所有者不在程序运行范围时,该值将被删除。(Rust对栈内存和堆内存一视同仁,超出作用域一律释放)

7 切片类型

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/520218.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无线传感器网络的Z-SEP路由协议及对比(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 无线传感网络最早应用于军事领域&#xff0c;随着工业界和学术界的关注度提高和技术的成熟&#xff0c;现已广泛应用于军事侦查…

kubernetes❀集群环境搭建

kubernetes❀集群环境搭建 2. kubernetes集群环境搭建2.1 前置知识点2.2 kubeadm 部署方式介绍2.3 安装要求2.4 最终目标2.5 准备环境2.6 环境初始化2.6.1 检查操作系统的版本2.6.2 主机名解析2.6.3 时间同步2.6.4 禁用iptable和firewalld服务2.6.5 禁用selinux2.6.6 禁用swap分…

Rust Wasm Linux开发环境搭建

一、Linux 镜像版本 CentOS-7-x86_64-DVD-2009.iso&#xff0c;Virtual Box 7.0 选择 GNOME Desktop 版本&#xff0c; 配置远程连接&#xff08;可选&#xff09;&#xff0c; nmtui 激活连接 enp0s3 &#xff0c;查看 ip 地址&#xff0c; 绑定端口转发&#xff0c; 通过…

gateway与zuul的区别与联系

前言 zuul1.0与spring-cloud-gateway的区别 Zuul: zuul是netflix公司的项目&#xff0c;本质上是web servlet&#xff0c;基于JavaEE Servlet技术栈&#xff0c;使用阻塞API&#xff0c;处理的是http请求&#xff0c;没有提供异步支持&#xff0c;不支持任何长连接&#xff0c…

Linux——进程信号3

内核如何实现信号的捕捉 信号捕捉的方法出了我们之前的signal之外&#xff0c;还有其它方法 sigaction sigaction&#xff1a;检查或更改一个信号的动作即捕捉信号 第一个参数&#xff0c;要捕捉的信号对应的编号&#xff0c;第二个参数&#xff1a;结构体&#xff08;这个结构…

4种整流电路、5种滤波电路

目录 基本电路变压电路整流电路半波整流电路全波整流电路桥式整流电路倍压整流电路 滤波电路电容滤波电路电感滤波电路RC滤波电路LC滤波电路有源滤波电路 整流滤波电路总结常用整流电路性能对照常用无源滤波电路性能对照电容滤波电路输出电流大小与滤波电容量的关系常用整流滤波…

nodejs+vue大学招聘求职网站

该系统的基本功能包括学生注册登录&#xff0c;企业注册登录&#xff0c;发布个人简历&#xff0c;发布企业招聘信息&#xff0c;新闻资讯&#xff0c;招聘信息&#xff0c;企业管理&#xff0c;学生信息管理&#xff0c;招聘信息管理,修改密码等功能。 系统首页 后台界面 1.…

【设计模式】设计模式简述及类图

设计模式的分类依据两个准则&#xff0c;第一个是目的准则&#xff0c;即模式是用来完成什么工作的。模式依据其目的可以分为创建型、结构型和行为型三种。创建型模式和对象的创建有关&#xff0c;结构型模式处理类或对象的组合。行为型模式对类或对象怎样交互和怎样分配职责进…

随机变量X,分布函数X~F(x)的理解。

1.随机变量X 1.通常认知的"x"与随机变量X 我们通常意义上的 x 是自变量&#xff0c;y f(x) 中的自变量。 但是 X 更多意义是 对应法则 " f " &#xff0c;X完整写法是 X(ω) ω ∈ Ω。 X这个对应法则&#xff0c;可以将样本点映射到实数轴上。 那么X这…

初识linux之POSIX信号量

目录 一、信号量的概念 1. 信号量的作用 2. 信号量的PV操作 3. 信号量操作接口 3.1 初始化信号量 3.2 销毁信号量 3.3 等待信号量&#xff08;P操作&#xff09; 3.4 发布信号量&#xff08;V操作&#xff09; 二、循环队列 三、使用循环队列模拟实现生产消费模型 1…

Spring 组成及拓展

1. Spring 组成 1.1 Spring的七大模块 1.2拓展 在Spring官网有这个介绍&#xff1a;现代化的Java开发&#xff01;说白了就是基于Spring的开发 - SpringBoot - 一个快速开发的脚手架 - 基于SpringBoot可以快速的开发单个微服务。 - 约定大于配置&#xff01; - SpringC…

ENVI实现遥感图像的最小距离、最大似然、支持向量机分类

目录 1 分类需求 2 具体操作 2.1 ROI区域绘制 2.2 最小距离法 2.3 最大似然法 2.4 支持向量机 3 精度评定 4 分类后处理 4.1 小斑块处理 4.2 分类统计 4.3 修改类别颜色 5 结果对比 本文介绍基于ENVI软件&#xff0c;实现最小距离法、最大似然法与支持向量机三种遥…

达索的多领域系统级仿真软件Dymola 2023版本下载与安装配置教程

目录 前言一、Dymola 安装二、使用配置总结 前言 Dymola是由Dassault Systemes公司开发的一款基于物理建模的多领域系统级仿真软件。它包含了多个领域的建模和仿真工具&#xff0c;如机械、电气、液压、热力学、控制等&#xff0c;可以用于对各种系统进行建模和仿真&#xff0…

GcExcel for Java edition 6.1.0 Crack

高速 Java Excel 电子表格 API 库,在 Java 应用程序中以编程方式创建、编辑、导入和导出 Excel 电子表格。几乎可以在任何地方部署。 创建、加载、编辑和保存 Excel 电子表格 保存为 .XLSX、PDF、HTML、CSV 和 JSON 基于具有零 Excel 依赖性的 Excel 对象模型 在本地、内部或云…

利用Facebook群组和页面打造忠实粉丝基础

社交媒体的崛起改变了我们与世界互动的方式&#xff0c;而Facebook作为其中的佼佼者&#xff0c;不仅让我们能够与朋友、家人保持联系&#xff0c;还提供了许多机会用于商业营销。利用Facebook群组和页面来打造忠实粉丝基础是许多品牌成功的关键之一。 一、创建一个引人注目的F…

bat脚本

bat脚本 bat脚本就是DOS批处理脚本&#xff0c;就是将一系列DOS命令按照一定顺序排列而形成的集合&#xff0c;运行在windows命令行环境上。这个文件的每一行都是一条DOS命令 在命令提示下键入批处理文件的名称&#xff0c;或者双击该批处理文件&#xff0c;系统就会调用Cmd.…

Java每日一练(20230513) 输出最值、盛水容器、旋转数组II

目录 1. 输出最值 ※ 2. 盛最多水的容器 &#x1f31f;&#x1f31f; 3. 搜索旋转排序数组 II &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 输出最值…

深度学习环境配置系列文章(二):Anaconda配置Python和PyTorch

深度学习环境配置系列文章目录 第一章 专业名称和配置方案介绍 第二章 Anaconda配置Python和PyTorch 第三章 配置VS Code和Jupyter的Python环境 第四章 配置Windows11和Linux双系统 第五章 配置Docker深度学习开发环境 第二章文章目录 深度学习环境配置系列文章目录前言一&…

VMware常用操作

一、vsphere linux虚拟机在线添加磁盘 1、编辑虚拟机设置 添加硬盘 后面步骤下一步即可 然后ssh 到虚拟机 查看/sys/class/scsi_host/ 有几个hostx按下列方法在线认磁盘 echo "- - -" > /sys/class/scsi_host/host2/scan 1、认到磁盘后创建pv pvcreate /dev/sdb …

【C++ 入坑指南】(04)基础语法

文章目录 一、注释二、变量三、常量四、关键字五、标识符 一、注释 作用&#xff1a;在代码中加一些说明和解释&#xff0c;方便自己或其他程序员阅读代码。 C 中有两种注释&#xff1a; 单行注释&#xff1a; // 描述信息 通常放在一行代码的上方&#xff0c;或者一条语句的…