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 ...
随机推荐
- Java开发桌面程序学习(四)——常用应用布局模板和简单分析
布局 前言 刚开始的时候,不知道使用什么布局,发现SceneBuilder其实有8.5版本的,里面就是有提供一个简单的桌面程序模板,8.5可以去官网下载,不过网速好像有点慢,慢慢等吧,官网下载地址 布 ...
- Redisson实现分布式锁(3)—项目落地实现
Redisson实现分布式锁(3)-项目落地实现 有关Redisson实现分布式锁前面写了两篇博客作为该项目落地的铺垫. 1.Redisson实现分布式锁(1)---原理 2.Redisson实现分布 ...
- go-gtk环境配置
go-gtk环境配置(用于go的图形化界面) 弄了一天,终于把这个环境给搭建好了,差不多就是安装msys2->安装gtk的各个版本->安装mingw(我原来装有但不影响,因为重复了,环境变 ...
- 「SAP技术」 SAP MM MPN物料的采购初探
「SAP技术」 SAP MM MPN物料的采购初探 1, MPN物料号与我方正常使用料号物料主数据之间的LINK关系维护 MPN料号 14000005 , 我方料号11000250 , 2,采购信息记 ...
- 【转载】Gradle for Android 第六篇( 测试)
由于现阶段Android开发趋于敏捷开发,再加上国内大大小小的互联网公司都在做app,导致很多这会是一个系列,所以如果你看完这篇文章,请看下列文章: 开发人员对单元测试没有基本的概念,但是本篇博文不会 ...
- 工具类ToastUtil 避免在子线程中使用抛异常 "Can't create handler inside thread that has not called Looper.prepare()"
package com.example.kbr.utils; import android.view.Gravity; import android.widget.Toast; import io.r ...
- Ubuntu个人使用笔记整理
Ubuntu笔记 Ubuntu使用过程中整理的一些常用或关键操作整理,以备不时之需, 另外自己可以对界面做一些美化,这部分自行百度去配置,我的界面如图 ##################Ubuntu ...
- Vue实战狗尾草博客后台管理系统第七章
Vue实战狗尾草博客后台管理平台第七章 本章内容为借助模块化来阐述Vuex的进阶使用. 在复杂项目的架构中,对于数据的处理是一个非常头疼的问题.处理不当,不仅对维护增加相当的工作负担,也给开发增加巨大 ...
- TypeScript 学习笔记(三)
类: 1.TypeScript 是面向对象的 JavaScript,类描述了创建的对象共同的属性和方法 2.类通过关键字 class 声明,使用 extends 关键字进行继承 3.在引用一个类成员时 ...
- 2019 蓝桥杯国赛 B 组模拟赛 题解
标签 ok #include<bits/stdc++.h> using namespace std; /* 求阶乘 去除尾部0 每次求阶乘时:结果去除尾0,并对 1e6取余 */ type ...