Rust从入门到放弃(1)—— hello,world
安装及环境配置
- 特点:安全,性能,并发
- rust源配置
- RLS安装
- cargo
- rust管理工具,该工具可以愉快方便的管理rust工程
#!/bin/bash
mkdir learn
cd learn
cargo init ## 该命令会在当前目录下初始化一个
## 目录下会出现一个Cargo.toml文件,这是Cargo的配置文件
## 还有一个src目录,目录中包含一个main.rs的初始文件
cargo run ## 命令会编译并运行程序
cargo build ## 编译工程
- rust管理工具,该工具可以愉快方便的管理rust工程
变量与函数
函数定义 fn main(){}
fn main(){
let world = "world";
println!("hello, {}!", world);
}
//该例子中可以看出来,变量定义使用关键字 let,字符串格式化中的占位符采用 {}
- let 关键字用于引入一个变量
- 占位符 {},在Rust中比较通用,将变量转化为字符串,这里的变量可以是数值或者字符串。
- 返回值,
->
fn main() {
let x:i32;
let y:i32;
x = 10;
y = 5;
println!("x = {}, y = {}", x, y);
println!("add(x, y) = {}", add(x,y));
}
fn add(x:i32, y:i32) ->i32{
x+y
// return x+y;
}
变量声明
let val:i32 = 1
- 在rust中类型定义采用 var: type的形式
fn foo(_x :&'static str) -> &'static str{
"world"
}
fn main(){
println!("hello, {}!", foo("bar"));
}
静态字符串变量 &'static str
注意:在rust中,
str是关键字,不能用作变量名
let (x,y) = (5, 'a')
// 类型分别是i32,char
- 默认情况下,Rust中的一切都是不可变的,也就是说变量定义后不可改变其值,下面这段代码编译不会通过。
let x:i32 =10;
x = 6;
// ^^^^^ cannot assign twice to immutable variable
- 如果要改变变量,声明时需要加上
mut关键字
let mut x:i32 = 10
x = 6
字符串,Rust中存在两种字符串类型,str和String。
- &str: 字符串切片,固定大小的,不可变的UTF-8字节序列。
let x = "hello world!";
let y:&str = "hahahhahahah";
- String对象是可变的,可以用
String::from初始化该类型
let x = String::from(“Hello, World”);
let y: String = String::from(“Isn’t it a wonderful life?");
{
let mut s1 :&str = "s1 is &str";
let mut s2 :String = String::from("s2 is String");
println!("{}, {}", s1, s2);
// s1 is &str, s2 is String
s1 = "s1 is changed";
s2 = String::from("s2 is changed");
println!("{}, {}", s1, s2);
// s1 is changed, s2 is changed
}
- 数字
- i8 i16 i32 i64
- u8 u16 u32 u64
- isize usize
- f32,f64
- 数组
let x = [1, 2, 3];
let y: [i32; 3] = [4, 5, 6];
- 数组不常使用,rust中vector更为常见
let x = vec![1, 2, 3];
let y: Vec<i32> = [4, 5, 6];
- 元组
- 有序的、不可变的对象列表
let x = (5, 'A');
let y : (i32, char) = (12, 'c');
let v = x.0 // v == 5
let a = y.1 // a == 'c'
- 有序的、不可变的对象列表
Rust中的所有权
所有权
- Rust中,每个变量对绑定到它上的值有所有权。
- Rust中堆上的每个值都有一个所有者(变量)
- 当所有者超出作用域时,该值将被丢弃
// String的长度是可变的,分配在堆中,所以这里的会发生所有权移动。
// 在Rust中,这个过程称之为移动move,即原本x的值移动到了y上,x失效了。
fn main(){
let x = String::from("hello"); // x是"hello"
let y = x; // y是“hello”,这时x已经失效
println!("x is {}, f(x) is {}",x, y); // 会出错,因为x失效了。
}
借用
- 任何借用的有效期都不能超过原始所有者的作用域
- 任何时刻,都能够不可变的借用一个资源许多次
- 任何时刻,都能够可变的借用一个资源一次
方法&关联函数
impl作为实现结构体方法的关键字,方法的输入参数中第一个是self。调用采用.impl范围内,输入参数没有self的方法,即为关联函数。调用使用:- 关联函数经常被用作返回一个结构体新实例的构造函数。下面的例子中,Square即为Rect的关联函数。
- 每个Struct允许多个
impl块
// 定义一个结构体
struct Rect{
width: i32,
length: i32,
}
// 方法
impl Rect{
fn Area(&self) -> i32{
self.width * self.length
}
}
// 关联函数
impl Rect{
fn Square(w:i32) -> Rect{
Rect{width :w,
length: w,
}
}
}
Rust从入门到放弃(1)—— hello,world的更多相关文章
- CYQ.Data 从入门到放弃ORM系列:开篇:自动化框架编程思维
前言: 随着CYQ.Data 开始回归免费使用之后,发现用户的情绪越来越激动,为了保持这持续的激动性,让我有了开源的念头. 同时,由于框架经过这5-6年来的不断演进,以前发的早期教程已经太落后了,包括 ...
- [精品书单] C#/.NET 学习之路——从入门到放弃
C#/.NET 学习之路--从入门到放弃 此系列只包含 C#/CLR 学习,不包含应用框架(ASP.NET , WPF , WCF 等)及架构设计学习书籍和资料. C# 入门 <C# 本质论&g ...
- OpenStack从入门到放弃
OpenStack从入门到放弃 目录: 为何选择云计算/云计算之前遇到的问题 什么是云计算 云服务模式 云应用形式 传统应用与云感知应用 openstack及其相关组件介绍 flat/vlan/gre ...
- 绕过校园网的共享限制 win10搭建VPN服务器实现--从入门到放弃
一.开篇立论= =.. 上次说到博主在电脑上搭建了代理服务器来绕过天翼客户端的共享限制,然而经过实际测试还不够完美,所以本着生命不息,折腾不止的精神,我又开始研究搭建vpn服务器= =... (上次的 ...
- 《区块链:从入门到放弃》之obc安装步骤
obc安装步骤 朋友们可能会好奇,厨师不研究菜谱怎么改研究兵法了,哈哈,我原本是app出身,最近被安排去预研区块链和比特币技术,2个月下来,颇有斩获.期间得到IBM的CC同学指导我一步一步安装obc的 ...
- win10搭建代理服务器实现绕过校园网的共享限制--从入门到放弃
博主所在学校特别坑爹,校园网被电信一家垄断了,而且最恶心的还是电信要求一条网线只能供一台电脑上网,不许接路由器共享网络= =- (还有电信2M价格是380+每年,20m是500每年,而且网速都很慢= ...
- WPF从入门到放弃系列第二章 XAML
本文是作者学习WPF从入门到放弃过程中的一些总结,主要内容都是对学习过程中拜读的文章的整理归纳. 参考资料 XAML 概述 (WPF):https://msdn.microsoft.com/zh-cn ...
- Android -- 带你从源码角度领悟Dagger2入门到放弃
1,以前的博客也写了两篇关于Dagger2,但是感觉自己使用的时候还是云里雾里的,更不谈各位来看博客的同学了,所以今天打算和大家再一次的入坑试试,最后一次了,保证最后一次了. 2,接入项目 在项目的G ...
- Android -- 带你从源码角度领悟Dagger2入门到放弃(二)
1,接着我们上一篇继续介绍,在上一篇我们介绍了简单的@Inject和@Component的结合使用,现在我们继续以老师和学生的例子,我们知道学生上课的时候都会有书籍来辅助听课,先来看看我们之前的Stu ...
随机推荐
- 聊一聊 bootstrap 的轮播图插件
今天做工作的时候,轻车熟路的做完,又用到了bootstrap的轮播图,觉得有必要安利一下这个插件,如果你需要的轮播图.功能不需要太炫酷,那么bootstrap的插件是你的首要选择. 使用方式 引入js ...
- .Net ADO拼接带参数的SQL语句
首先是在DAL数据访问层中的代码://数据更新的方法public static int shuxing_update(s_passnature model) { string sql = " ...
- CNN反向传播更新权值
背景 反向传播(Backpropagation)是训练神经网络最通用的方法之一,网上有许多文章尝试解释反向传播是如何工作的,但是很少有包括真实数字的例子,这篇博文尝试通过离散的数据解释它是怎样工作的. ...
- 前端之html5和css3
圆角,透明度,rgba CSS3圆角 设置某一个角的圆角,比如设置左上角的圆角:border-top-left-radius:30px 60px;同时分别设置四个角: border-radius:30 ...
- 用 Python 监控知乎和微博的热门话题
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: TED Crossin的编程教室 PS:如有需要Python学习资料 ...
- Linux—服务器SSL/TLS快速检测工具(TLSSLed)
一.下载TLSSLed [root@localhost ~]# yum install tlssled 二.服务器SSL/TLS快速检测工具TLSSLed 现在SSL和TLS被广泛应用服务器的数据加密 ...
- Linux—网络通讯管理命令
一.ping命令 . ping 主机名 . ping 域名 [root@localhost ~]# ping www.baidu.com . ping IP地址 [root@localhost ~]# ...
- 『005』Web集群
『006』索引-The Web cluster 准备更新中
- Java 并发(1)——线程安全
我们对并发一词并不陌生,它通常指多个任务同时执行.实际上这不完全对,“并行”才是真正意义上的同时执行,而“并发”则更偏重于多个任务交替执行.有时候我们会看见一些人一边嘴里嚼着东西一边讲话,这是并行:当 ...
- 一次shell脚本小事故,从中学习排错过程-软件测试
一次shell脚本小事故,从中学习排错过程 事出,童鞋使用shell脚本搭建测试环境的过称中..... 配置环境变量文件:/etc/profile(用于升级JDK或其他) 手动编辑方法:vi /etc ...