rust 开篇

1、rust 语言特点

  • Rust 基于C++,理论上来说,它的速度与 C / C++ 同级
  • Rust 被设计为保证内存和线程安全
  • Rust 类似 C 或者 C++ 也是编译型的编程语言
  • 与C/C++区别
    • Rust是线程安全的
    • Rust 不允许空指针悬挂指针
  • Rust主要用于高度安全和并发的软件系统

2、下载安装rust

1. 源码安装 rust

1. 下载rust源码

git clone

git clone https://github.com/rust-lang/rust.git

或者直接下载当前版本的源码压缩包

wget https://github.com/rust-lang/rust/archive/master.zip

2. rust源码编译的环境要求

  • g++ 4.7 or later or clang++ 3.x or later
  • python 2.7 (but not 3.x)
  • GNU make 3.81 or later
  • cmake 3.4.3 or later
  • curl
  • git

3. 进入到rust源码目录编译

➜  rust ./x.py build && sudo ./x.py install
  • ./x.py build 执行py脚本下载一些依赖文件
  • sudo ./x.py install 执行py脚本进行安装

2. 直接下载安装

➜  ~ curl -sSf https://static.rust-lang.org/rustup.sh | sh
Password:
rustup: gpg available. signatures will be verified
rustup: downloading manifest for 'stable'
rustup: downloading toolchain for 'stable'
######################################################################## 100.0%
gpg: assuming signed data in '/Users/xiongzenghui/.rustup.sh/dl/279d7075ba297b992559/rust-1.24.1-x86_64-apple-darwin.tar.gz'
gpg: 签名建立于 五  3/ 2 07:47:10 2018 CST
gpg:               使用 RSA 密钥 5CB4A9347B3B09DC
gpg: 完好的签名,来自于“Rust Language (Tag and Release Signing Key) <rust-key@rust-lang.org>” [未知]
gpg: 警告:这把密钥未经受信任的签名认证!
gpg:       没有证据表明这个签名属于它所声称的持有者。
主钥指纹: 108F 6620 5EAE B0AA A8DD  5E1C 85AB 96E6 FA1B E5FE
子钥指纹: C134 66B7 E169 A085 1886  3216 5CB4 A934 7B3B 09DC
rustup: installing toolchain for 'stable'
rustup: extracting installer
Password:
install: creating uninstall script at /usr/local/lib/rustlib/uninstall.sh
install: installing component 'rustc'
install: installing component 'cargo'
install: installing component 'rls-preview'
install: installing component 'rustfmt-preview'
install: installing component 'rust-analysis-x86_64-apple-darwin'
install: installing component 'rust-std-x86_64-apple-darwin'
install: installing component 'rust-docs'

    Rust is ready to roll.

➜  ~

3、rust helloworld

源文件

fn main() {
  println!("Hello World by Rust ~");
}

编译链接生成可执行程序main

➜  main rustc main.rs
➜  main file main
main: Mach-O 64-bit executable x86_64
➜  main

执行可执行程序main

➜  main ./main
Hello World by Rust ~
➜  main

4、格式化输出

// fn main() {
//   let mystr :&str = "abcd";
//   println!("mystr  address:  {:p}", &mystr);
//   println!("mystr  address:  {:p}", &mystr[1..]);
//   println!("mystr  address:  {:p}", &mystr[2..]);
//   println!("mystr  address:  {:p}", &mystr[3..]);
// }


fn main() {
  // {}表示占位符,由后面的31替换
  println!("{} days", 31);

  // {0} 使用后面第几个参数替换
  println!("{0}, this is {1}. {1}, this is {0}", "Alice", "Bob");

  // named arguments.
  println!("{subject} {verb} {predicate}",
    predicate="over the lazy dog",
    subject="the quick brown fox",
    verb="jumps"
  );

  // Special formatting can be specified after a `:`.
  // :b => 二进制输出
  println!("{} - {:b} ", 2, 2);

  // error 少一个参数
  // println!("My name is {0}, {1} {0}", "Bond")

  // {:?} 自动根据数据类型输出
  let f2: bool = false;
  println!("f2 = {:?}", f2);

  // {:p} 输出变量标记的内存地址
  let name = "xiong";
  println!("&name = {:p}", &name) 
}
➜  main make
rustc main.rs
./main
31 days
Alice, this is Bob. Bob, this is Alice
the quick brown fox jumps over the lazy dog
2 - 10
f2 = false
&name = 0x7fff58cf2740
➜  main

5、条件编译

1. #[cfg(foo)]

#[cfg(foo)]
fn foo() {
  println!("foo()")
}

fn main()
{
  #[cfg(foo)]
  foo();
}
➜  main rustc main.rs
➜  main ./main
➜  main
➜  main
➜  main rustc main.rs --cfg foo
➜  main ./main
foo()
➜  main

2. #[cfg(not(foo))]

#[cfg(not(foo))]
fn foo() {
  println!("foo()")
}

fn main()
{
  #[cfg(not(foo))]
  foo();
}
➜  main rustc main.rs --cfg foo
➜  main ./main
➜  main
➜  main rustc main.rs
➜  main ./main
foo()
➜  main

3. [cfg(foo = "baz")]

#[cfg(feature = "run")]
fn run() {
  println!("run()")
}

#[cfg(feature = "cry")]
fn cry() {
  println!("cry()")
}

fn main()
{
  #[cfg(feature = "run")]
  run();

  #[cfg(feature = "cry")]
  cry();
}
➜  main rustc main.rs --cfg feature=\"run\"
➜  main ./main
run()
➜  main
➜  main rustc main.rs --cfg feature=\"cry\"
➜  main ./main
cry()
➜  main
➜  main rustc main.rs
➜  main ./main
➜  main

4. any 条件组合

#[cfg(all(run, cry))]
fn run() {
  println!("run()")
}

#[cfg(all(run, cry))]
fn cry() {
  println!("cry()")
}

#[cfg(any(run, cry))]
fn any() {
  println!("cry() || run()")
}

fn main()
{
  #[cfg(any(run, cry))]
  any();
}
➜  main rustc main.rs
➜  main ./main
➜  main
➜  main rustc main.rs --cfg run
➜  main ./main
cry() || run()
➜  main
➜  main rustc main.rs --cfg cry
➜  main ./main
cry() || run()
➜  main

5. all 条件组合

#[cfg(all(run, cry))]
fn run() {
  println!("run()")
}

#[cfg(all(run, cry))]
fn cry() {
  println!("cry()")
}

#[cfg(any(run, cry))]
fn any() {
  println!("cry() || run()")
}

fn main()
{
  #[cfg(all(run, cry))]
  {
    run();
    cry();
  }

  #[cfg(any(run, cry))]
  any()
}
➜  main rustc main.rs
➜  main ./main
➜  main
➜  main rustc main.rs --cfg run
➜  main ./main
cry() || run()
➜  main
➜  main rustc main.rs --cfg cry
➜  main ./main
cry() || run()
➜  main
➜  main rustc main.rs --cfg cry --cfg run
➜  main ./main
run()
cry()
cry() || run()
➜  main

6. 任意位置使用cfg内置对象

fn main()
{
  if cfg!(target_os = "macos") || cfg!(target_os = "ios") {
    println!("Think Different!");
  }
}
➜  main rustc main.rs
➜  main ./main
Think Different!
➜  main
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,928评论 6 509
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,748评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,282评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,065评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,101评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,855评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,521评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,414评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,931评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,053评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,191评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,873评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,529评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,074评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,188评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,491评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,173评论 2 357

推荐阅读更多精彩内容

  • Distutils可以用来在Python环境中构建和安装额外的模块。新的模块可以是纯Python的,也可以...
    MiracleJQ阅读 3,079评论 0 1
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,673评论 18 139
  • 学会去向潜意识层面寻求答案,都说日有所思夜有所梦,所以很多我们梦中出现的事情展开联想,会发现我们想要的答案。
    合肥李风丽阅读 135评论 0 0
  • 分享最近收获的几个句子: 弗兰克·克拉克的一句话,至今印象深刻: 家长可以传授给孩子最重要的一课便是,如何离开父母...
    坚持行动家安小小阅读 92评论 0 1