Rust语言学习笔记(11)

作者:@zwvista
本文为作者原创,转载请注明出处:https://www.cnblogs.com/zwvista/p/12758683.html


目录

Rust 2015 vs Rust 2018
loop
impl Trait
dyn Trait
关联函数和关联常量
..=(闭区间)
Non-lexical lifetimes
? 操作符
Slice patterns

Rust 2015 vs Rust 2018

loop

loop 循环也能返回值

// old code
let x;
loop {
    x = 7;
    break;
}
// new code
let x = loop { break 7; };

impl Trait

表示参数以及返回值是特质类型时使用 impl Trait 语法。

// Argument Position
trait Trait {}
fn foo<T: Trait>(arg: T) {
}
fn foo(arg: impl Trait) {
}
// Return Position
trait Trait {}
impl Trait for i32 {}
fn returns_a_trait_object() -> Box<dyn Trait> {
    Box::new(5)
}
fn returns_a_trait_object() -> impl Trait {
    5
}
// closures
fn returns_closure() -> Box<dyn Fn(i32) -> i32> {
    Box::new(|x| x + 1)
}
fn returns_closure() -> impl Fn(i32) -> i32 {
    |x| x + 1
}

dyn Trait

特质类型的对象使用 dyn Trait 语法

trait Trait {}
impl Trait for i32 {}
// old
fn function1() -> Box<Trait> {
}
// new
fn function2() -> Box<dyn Trait> {
}
use std::rc::Rc;
trait Foo {}
impl Foo for i32 {
}
fn main() {
    let obj: Rc<dyn Foo> = Rc::new(5);
}

关联函数和关联常量

对应于其他语言中的静态方法和静态常量

// 关联函数
struct Struct;
impl Struct {
    fn foo() {
        println!("foo is an associated function of Struct");
    }
}
fn main() {
    Struct::foo();
}
// 结构体的关联常量
struct Struct;
impl Struct {
    const ID: u32 = 0;
}
fn main() {
    println!("the ID of Struct is: {}", Struct::ID);
}
// 特质的关联常量
trait Trait {
    const ID: u32;
}
struct Struct;
impl Trait for Struct {
    const ID: u32 = 5;
}
fn main() {
    println!("{}", Struct::ID);
}

..=(闭区间)

// 半开区间
// 1,2
for i in 1..3 {
    println!("i: {}", i);
}
// 闭区间
// 1,2,3
for i in 1..=3 {
    println!("i: {}", i);
}

Non-lexical lifetimes

fn main() {
    let mut x = 5;
    let y = &x;
    let z = &mut x; // now ok
    println!("y: {}", y); // error
}

? 操作符

// old
fn read_username_from_file() -> Result<String, io::Error> {
    let f = File::open("username.txt");
    let mut f = match f {
        Ok(file) => file,
        Err(e) => return Err(e),
    };
    let mut s = String::new();
    match f.read_to_string(&mut s) {
        Ok(_) => Ok(s),
        Err(e) => Err(e),
    }
}
// old
fn read_username_from_file() -> Result<String, io::Error> {
    let mut f = try!(File::open("username.txt"));
    let mut s = String::new();
    try!(f.read_to_string(&mut s));
    Ok(s)
}
// new
fn read_username_from_file() -> Result<String, io::Error> {
    let mut f = File::open("username.txt")?;
    let mut s = String::new();
    f.read_to_string(&mut s)?;
    Ok(s)
}

Slice patterns

// 匹配片段
fn main() {
    greet(&[]);
    // output: Bummer, there's no one here :(
    greet(&["Alan"]);
    // output: Hey, there Alan! You seem to be alone.
    greet(&["Joan", "Hugh"]);
    // output: Hello, Joan and Hugh. Nice to see you are at least 2!
    greet(&["John", "Peter", "Stewart"]);
    // output: Hey everyone, we seem to be 3 here today.
}
fn greet(people: &[&str]) {
    match people {
        [] => println!("Bummer, there's no one here :("),
        [only_one] => println!("Hey, there {}! You seem to be alone.", only_one),
        [first, second] => println!(
            "Hello, {} and {}. Nice to see you are at least 2!",
            first, second
        ),
        _ => println!("Hey everyone, we seem to be {} here today.", people.len()),
    }
}
// 匹配片段
let arr = [1, 2, 3];
assert_eq!("ends with 3", match arr {
    [_, _, 3] => "ends with 3",
    [a, b, c] => "ends with something else",
});
(0)

相关推荐

  • Rust基础学习笔记(零):复习基本知识

    由于一个学期没有碰Rust,相关知识殆已忘尽.最近各课逐渐停授,余出时间来从基础重温这些知识,也算是对没有写的基础知识的补充.另外这次复习主要参照了Youtube上的Crush Course视频,两个 ...

  • Rust 中的 Closure

    原理 有些语言中没有 closure 和普通函数的区分,但 Rust 有.对 Rust 来说普通函数就是一段代码.而 closure 和 C 类似:每个 closure 会创建一个匿名的struct, ...

  • use关键字在PHP中的几种用法

    use关键字在PHP中的几种用法 在学习了和使用了这么多年的PHP之后,您知道use这个关键字在PHP中都有哪些用法吗?今天我们就来看一下它的三种常见用法. 1. 用于命名空间的别名引用 // 命名空 ...

  • 缠论学习笔记11:级别真不像某些人说的那么复杂

    最近,看到有人谈到级别,认为级别是缠论中一个很难懂的概念.其实,级别真不是什么高深的东西.我们就算不学缠论,不也经常用到不同级别的k线图和技术指标吗?比如5分钟.10分钟.30分钟.60分钟.日.月k ...

  • 胡希恕伤寒论学习笔记——11

    11.病人身大热,反欲得衣者,热在皮肤寒在骨髓也:身大寒,反不欲近衣者,寒在皮肤热在骨髓也. 这条是说明病家寒热真假的事宜.皮肤指的是身体表面,骨髓指的是身体内部. 有些病家会表现出皮肤表面比较热,甚 ...

  • 王烁老师30天认知训练营学习笔记11

    今天学习的是王烁老师30天认知训练营中的<宽容,打三个补丁> 在中国有两位文化名人,一位是鲁迅,另一位是胡适.前者以主张"一个都不宽恕"闻名,后者则主张宽容是自由不可或 ...

  • 【Go语言学习笔记一】基础语法

    行分隔行 在 Go 程序中,一行代表一个语句结束.每个语句不需要像 C 家族中的其它语言一样以分号 ; 结尾, 但是可以使用分号:结尾,如果当你将多个语句写在同一行时,则必须使用分号: 一.变量 1. ...

  • HALCON 20.11:深度学习笔记(11)

    HALCON 20.11.0.0中,实现了深度学习方法. 本章讲解了如何使用基于深度学习的对象检测. 通过对象检测,我们希望在图像中找到不同的实例,并将它们分配给一个类.实例可以部分重叠,但仍然可以区 ...

  • R语言学习笔记

    R语言学习笔记

  • 学习笔记11 | 区别强化方法及选择替代行为

    2020年春节前夕,"新型冠状病毒"爆发,线下培训机构被迫停课,更多的孤独症孩子家长将目光投向远程家庭干预. A-IFSP-ASD已经进行了数日,在过去的这段时间里,凭着对孩子的爱 ...

  • R语言学习笔记(四):apply,sapply,lapply,tapply,vapply以及mapply的用法

    apply() apply(m,dimcode,f,fargs) m 是一个矩阵. dimcode是维度编号,取1则为对行应用函数,取2则为对列运用函数. f是函数 fargs是f的可选参数集 > ...