首页 > 其他分享 >rust进阶手册(1)

rust进阶手册(1)

时间:2023-06-19 21:04:17浏览次数:49  
标签:myvec 手册 let learnrust target println main rust 进阶

目录

安装

不管OS是否带有rust,都应使用rustup来安装rust

  • linux/freebsd
curl https://sh.rustup.rs -sSf | sh
rustup toolchain install stable-x86_64-pc-windows-gnu
rustup default stable-x86_64-pc-windows-gnu

管理和配置工具

  • cargo
    cargo管理编译、包,含有通用工具。
  • rustc
    编译器
  • rustdoc
    rust文档工具,代码注释中规定格式编写的文档,可用于生成格式化的html文档。

项目管理

  • 创建项目
% cargo new --bin learn1

freebsd@localhost:~/learnrust % ls learn1
Cargo.toml      src

Cargo.toml 保存包的元数据

 % cat learn1/Cargo.toml
[package]
name = "learn1"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]

测试


freebsd@localhost:~/learnrust % cd learn1/src
freebsd@localhost:~/learnrust/learn1/src % ls
main.rs
freebsd@localhost:~/learnrust/learn1/src % cat main.rs
fn main() {
    println!("Hello, world!");
}
freebsd@localhost:~/learnrust/learn1/src % cargo run
   Compiling learn1 v0.1.0 (/usr/home/freebsd/learnrust/learn1)
    Finished dev [unoptimized + debuginfo] target(s) in 4.53s
     Running `/usr/home/freebsd/learnrust/learn1/target/debug/learn1`
Hello, world!

类型

  • 浮点型
    f32 : 相当于float
    f64: 相当于double
fn main() {
    let x:f32=11.111;
    let y:f64=11.1111111111111;
    println!("{},{}",x,y);
}
$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.01s
     Running `/home/maisipu/learn/learnrust/target/debug/learnrust`
11.111,11.1111111111111
  • 推断

下面函数add里定义了myvec变量,但未明确指定其类型,rust编译器可以推断出其元素类型为i32,

fn add(a:i32,b:i32)->Vec<i32>{
    let mut myvec=Vec::new();
    myvec.push(a);
    myvec.push(b);
    myvec.push(a+b);
    myvec

}
fn main() {
    println!("{:?}",add(11,12));
}  

字面值

  • 不同进制
[maisipu@192 src]$ cat main.rs
fn main() {
    println!("{},{},{},{}",22,0x8afb,0o102,0b10010001);
}
[maisipu@192 src]$ rustc main.rs
[maisipu@192 src]$ ./main
22,35579,66,145

ox 十六进制
0b:二进制
0o:八进制

  • 转义字符
fn main() {
    println!("{:?},{}",b'\n',b'\\');
}
$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.01s
     Running `/home/maisipu/learn/learnrust/target/debug/learnrust`
10,92

格式输出

打印操作由 std::fmt 里面所定义的一系列宏来处理,包括:

  • format!:将格式化文本写到字符串。
  • print!:与 format! 类似,但将文本输出到控制台(io::stdout)。
  • println!: 与 print! 类似,但输出结果追加一个换行符。
  • eprint!:与 print! 类似,但将文本输出到标准错误(io::stderr)。
  • eprintln!:与 eprint! 类似,但输出结果追加一个换行符。

位置参数

fn add(a:i32,b:i32)->Vec<i32>{
    let mut myvec=Vec::new();
    myvec.push(a);
    myvec.push(b);
    myvec.push(a+b);
    myvec

}
fn main() {
    let myvec=add(1,20);
    println!("{}",myvec[0]);
    println!("{0}+{1}={2}",myvec[0],myvec[1],myvec[2]);
}

% cargo run
   Compiling learn1 v0.1.0 (/usr/home/freebsd/learnrust/learn1)
    Finished dev [unoptimized + debuginfo] target(s) in 0.13s
     Running `target/debug/learn1`
1
1+20=21

格式化文本

fn add(a:i32,b:i32)->Vec<i32>{
    let mut myvec=Vec::new();
    myvec.push(a);
    myvec.push(b);
    myvec.push(a+b);
    myvec

}
fn main() {
    let myvec=add(1,20);
    println!("{}",myvec[0]);
    println!("{:?}:{}+{}={}",myvec,myvec[0],myvec[1],myvec[2]);
}
% cargo run
   Compiling learn1 v0.1.0 (/usr/home/freebsd/learnrust/learn1)
    Finished dev [unoptimized + debuginfo] target(s) in 0.13s
     Running `target/debug/learn1`
1
[1, 20, 21]:1+20=21

命名参数

fn add(a:i32,b:i32)->Vec<i32>{
    let mut myvec=Vec::new();
    myvec.push(a);
    myvec.push(b);
    myvec.push(a+b);
    myvec

}
fn main() {
    let myvec=add(1,20);
    println!("{}",myvec[0]);
    let result=myvec[2];
    println!("{:?}:{result}",myvec);
}

% cargo run
   Compiling learn1 v0.1.0 (/usr/home/freebsd/learnrust/learn1)
    Finished dev [unoptimized + debuginfo] target(s) in 0.10s
     Running `target/debug/learn1`
1
[1, 20, 21]:21

@

目录

类型转换

使用as

[maisipu@192 src]$ cargo run
   Compiling learnrust v0.1.0 (/home/maisipu/learn/learnrust)
    Finished dev [unoptimized + debuginfo] target(s) in 0.57s
     Running `/home/maisipu/learn/learnrust/target/debug/learnrust`
11,11
fn main() {
    let x:f32=11.111;
    let y:f64=11.1111111111111;
    println!("{},{}",x as i32 ,y as i8);
}

浮点字面值

fn main(){
    let x=11.111_f32;
    let y=11.1111111111111_f64;
    println!("{},{}",x,y);
}
[maisipu@192 src]$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.01s
     Running `/home/maisipu/learn/learnrust/target/debug/learnrust`
11.111,11.1111111111111
[maisipu@192 src]$ 

字符类型

char为字符类型,用32位值形式表示unicode字符。

fn main(){
    let x='你';
    let y:char='z';
    println!("{},{}",x,y);
}

$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.01s
     Running `/home/maisipu/learn/learnrust/target/debug/learnrust`
你,z

数组

  • 数组表达式构造数组。数组表达式有两种形式。

第一种形式列出了数组中的每个值。
语法是一个逗号分隔的统一类型的表达式列表,用方括号括起来。这将生成一个数组,其中按写入顺序包含这些值中的每一个。

第二种形式的语法是由方括号中的分号(;)分隔的两个表达式。
前面的表达式;称为重复操作数。后面的表达式;称为长度操作数。它必须具有usinize类型,并且是常量表达式,例如文字或常量项。此形式的数组表达式创建一个长度为长度操作数值的数组,每个元素都是重复操作数的副本。

当重复操作数是常量项时,将按长度操作数的值对其求值。如果该值为0,则根本不计算常量项。对于不是常量项的表达式,只计算一次,然后将结果复制到长度操作数的值次。

  • 数组可以迭代
    for表达式用于在std::iter::IntoIdeator的实现所提供的元素上循环。如果迭代器为空,则for表达式完成。
fn main(){
    let y=[11,22,33];
    for i in y{
        println!("{}",i);
    }
    let z=[111;9];
    println!("{:?}",z);
}
11
22
33
[111, 111, 111, 111, 111, 111, 111, 111, 111]

元组

  • 元素的每个类型可以不同

  • 元组不能迭代访问

fn main(){
    let y=(11,22,33);
    for i in y{
        println!("{}",i);
    }
}

上面代码是错误的,因为元组的元素类型不一定会一致

  • 只允许用常量作为索引

与字段访问表达式不同,元组索引表达式可以是调用表达式的函数操作数,因为它不能与方法调用混淆,因为方法名称不能是数字。

尽管数组和切片也有元素,但必须使用数组或切片索引表达式或切片模式来访问它们的元素。

fn main(){
    let y=(1,22,333);
    println!("{},{},{}",y.0,y.1,y.2);
    let z=(111,"asddsaddaa");
    println!("{:?}",z);
}
[maisipu@192 src]$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.01s
     Running `/home/maisipu/learn/learnrust/target/debug/learnrust`
1,22,333
(111, "asddsaddaa")

  • 元组经常作为函数的返回类型,可以返回多个值
  • 元组也可以作为函数的参数
[maisipu@192 src]$ cat main.rs
fn get_sum(nums:(i32,i32,i32))->(i32,i32){
    let mut result:i32=0;
    result=result+nums.0+nums.1+nums.2;
    (result,result/3)
}
fn main(){
    let y=(1,22,333);
    println!("{:?}",get_sum(y));
}
[maisipu@192 src]$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.01s
     Running `/home/maisipu/learn/learnrust/target/debug/learnrust`
(356, 118)
[maisipu@192 src]$ 

标签:myvec,手册,let,learnrust,target,println,main,rust,进阶
From: https://www.cnblogs.com/waterperl/p/17492134.html

相关文章

  • Ruby进阶手册(1)
    目录关于Rubyrbenvrbenv是类Unix系统上Ruby编程语言的版本管理工具使用程序包管理器安装ruby安装gems卸载Ruby版本设置path安装rails关于Ruby想知道Ruby为什么会如此受欢迎吗?在粉丝眼中,Ruby是一门优美而巧妙的语言,他们还认为Ruby易于使用,能解决实际问题。想知道受到这些......
  • python进阶手册(2)
    目录语法细节函数参数默认参数传引用可变(数量)参数列表解析正则表达式仅查找第一次匹配的文本串编译后的正则表达式对象多重匹配函数参数位置参数关键字参数可变(数量)关键字参数函数作为函数的参数函数工厂匿名函数正则表达式语法细节编码声明Python脚本第一或第二行的注释匹......
  • Rust语言 - 接口设计的建议之显而易见(Obvious)
    Rust语言-接口设计的建议之显而易见(Obvious)RustAPI指南GitHub:https://github.com/rust-lang/api-guidelinesRustAPI指南中文:https://rust-chinese-translation.github.io/api-guidelines/RustAPI指南:https://rust-lang.github.io/api-guidelines/显而易见(Obvious)......
  • Android中高级开发进阶必备资料(附:PDF+视频+源码笔记)
    前言Android开发学习过程中要掌握好基础知识,特别是java语言的应用,然后逐步提升开发者在学习过程中遇到的一些细致化的问题,把一些难点进行解决,在开发过程中把容易出现的一些难点进行合理化控制,避免在程序生成产品后出现问题,从而导致崩溃,这是非常重要的一点。架构师筑基必备技能作为......
  • 强化学习从基础到进阶-常见问题和面试必知必答[1]:强化学习概述、序列决策、动作空间
    强化学习从基础到进阶-常见问题和面试必知必答[1]:强化学习概述、序列决策、动作空间定义、策略价值函数、探索与利用、Gym强化学习实验1.强化学习核心概念强化学习(reinforcementlearning,RL):智能体可以在与复杂且不确定的环境进行交互时,尝试使所获得的奖励最大化的算法。动......
  • Android进阶宝典 -- JetPack Navigation的高级用法(解决路由跳转新建Fragment页面问题)
    相信有相当一部分的伙伴,在项目开发中依然使用Activity作为页面承载体,有10个页面就会有10个Activity,这种方式当然没问题,但是如果涉及到页面间数据共享,那么使用多Activity就不是很方便了,需要Activity传递各种数据,涉及到数据的序列化与反序列化;因此产生了单Activity和多Fragment架构,所......
  • 腾讯薪选T9级Android进阶学习路线(内含全套学习笔记+视频资料)
    随着android系统的迭代更新和开源api的强大,相信大部分开发者技术的瓶颈很难突破。想要突破瓶颈,我们就需要搭建完备的知识体系,让学到的知识体系化。这里,我整理了Android开发中的一些知识点,包括架构师筑基必备技能、源码解析、性能优化、Kotlin、高级UI、NDK模块、Flutter及微信小程......
  • Android进阶宝典 -- CoordinatorLayout协调者布局原理分析并实现吸顶效果
    1CoordinatorLayout功能介绍首先我们先从源码中能够看到,CoordinatorLayout只实现了parent接口(这里如果不清楚parent接口是干什么的,建议看看前面的文章,不然根本不清楚我讲的是什么),说明CoordinatorLayout只能作为父容器来使用。publicclassCoordinatorLayoutextendsViewGroupim......
  • python 进阶
    isinstance()函数来判断一个对象是否是一个已知的类型,类似type()。isinstance(object,classinfo)>>>a=2>>>isinstance(a,int)True>>>isinstance(a,str)False>>>isinstance(a,(str,int,list))#是元组中的一个返回TrueTrue ......
  • Android性能优化知识脑图总结+学习手册文档,超干分享!
    近几年,Android开发技术不断发展,岗位要求不断升高,导致程序员的面试也进一步向更深、更广处延伸,比如原先很少涉及的性能优化,现已成为大厂的高频面试题。熟悉性能优化相关内容,就相当于拿到大厂的敲门砖,更是工作中最能突显价值的金字招牌。但众所周知,想要学习和掌握性能优化,就必须有实......