`

rust闭包

    博客分类:
  • rust
 
阅读更多
返回闭包
fn returns_closure() -> Box<dyn Fn(i32) -> i32> {
    Box::new(|x| x + 1)
}


main.rs
use std::thread;
use std::time::Duration;

fn simulated_expensive_calculation(intensity: u32) -> u32 {
    println!("calculating slowly...");
    thread::sleep(Duration::from_secs(2));
    intensity
}

struct Cacher<T>
    where
        T: Fn(u32) -> u32,//指定它是一个闭包Fn
{
    calculation: T,
    value: Option<u32>,
}

impl<T> Cacher<T>
    where
        T: Fn(u32) -> u32,
{
    fn new(t: T) -> Cacher<T>{
        Cacher{
            calculation:t,
            value:None,
        }
    }

    fn value(&mut self,arg: u32) -> u32{
        match self.value {
            Some(v) => v,
            None => {
                let v = (self.calculation)(arg);
                self.value = Some(v);
                v
            }
        }
    }
}

fn generate_workout(intensity: u32, random_number: u32) {
    //let expensive_result = simulated_expensive_calculation(intensity);
    //闭包,这里的u32不指定也可以推断出来
    // let expensive_closure = |num:u32| {
    //     println!("calculating slowly...");
    //     thread::sleep(Duration::from_secs(2));
    //     num
    // };

    //将闭包设置到结构体T中
    let mut expensive_closure = Cacher::new(|num:u32| {
        println!("calculating slowly...");
        thread::sleep(Duration::from_secs(2));
        num
    });
    if intensity < 25 {
        println!("Today, do {} pushups!", expensive_closure.value(intensity));
        println!("Next, do {} situps!", expensive_closure.value(intensity));
    } else {
        if random_number == 3 {
            println!("Take a break today! Remember to stay hydrated!");
        } else {
            println!("Today, run for {} minutes!", expensive_closure.value(intensity));
        }
    }
}

fn main() {
    let simulated_user_specified_value = 10;
    let simulated_random_number = 7;

    generate_workout(simulated_user_specified_value, simulated_random_number);

    let example_closure = |x| x;

    let s = example_closure(String::from("hello"));
    //闭包只能初始化一次类似,上面初始化为String了,下面则会编译失败
    //let n = example_closure(5);

    // let x = 4;
    //
    // fn equal_to_x(z: i32) -> bool {
    //     println!("x:{}",x); //闭包不能使用外部的值
    //     true
    //     //z == x
    // }

    let x = vec![1, 2, 3];

    //let equal_to_x = move |z| z == x;
    let y:Vec<_> = x.iter().map(|x|x+1).collect();
    for i in y {
        print!("{}",i);
    }
    println!();
}

#[test]
fn call_with_different_values() {
    let mut c = Cacher::new(|a| a);

    let v1 = c.value(1);
    //这里值还是1,不会变
    let v2 = c.value(2);
    println!("v2:{}",v2);

    assert_eq!(v2, 2);
}

calculating slowly...
Today, do 10 pushups!
Next, do 10 situps!
234


lib.rs
#[test]
fn iterator_demonstration() {
    let v1 = vec![1, 2, 3];

    let mut v1_iter = v1.iter();

    assert_eq!(v1_iter.next(), Some(&1));
    assert_eq!(v1_iter.next(), Some(&2));
    assert_eq!(v1_iter.next(), Some(&3));
    assert_eq!(v1_iter.next(), None);
}

#[test]
fn iterator_sum() {
    let v1 = vec![1, 2, 3];

    let v1_iter = v1.iter();

    let total: i32 = v1_iter.sum();

    assert_eq!(total, 6);
}

#[derive(PartialEq, Debug)]
struct Shoe {
    size: u32,
    style: String,
}

//filter迭代器适配器捕获其环境的闭包
fn shoes_in_size(shoes: Vec<Shoe>, shoe_size: u32) -> Vec<Shoe> {
    shoes.into_iter().filter(|s| s.size == shoe_size).collect()
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn filters_by_size() {
        let shoes = vec![
            Shoe {
                size: 10,
                style: String::from("sneaker"),
            },
            Shoe {
                size: 13,
                style: String::from("sandal"),
            },
            Shoe {
                size: 10,
                style: String::from("boot"),
            },
        ];

        let in_my_size = shoes_in_size(shoes, 10);

        assert_eq!(
            in_my_size,
            vec![
                Shoe {
                    size: 10,
                    style: String::from("sneaker")
                },
                Shoe {
                    size: 10,
                    style: String::from("boot")
                },
            ]
        );
    }
}

struct Counter {
    count: u32,
}

impl Counter {
    fn new() -> Counter {
        Counter { count: 0 }
    }
}

impl Iterator for Counter {
    type Item = u32;

    fn next(&mut self) -> Option<Self::Item> {
        if self.count < 5 {
            self.count += 1;
            Some(self.count)
        } else {
            None
        }
    }
}

#[test]
fn calling_next_directly() {
    let mut counter = Counter::new();

    assert_eq!(counter.next(), Some(1));
    assert_eq!(counter.next(), Some(2));
    assert_eq!(counter.next(), Some(3));
    assert_eq!(counter.next(), Some(4));
    assert_eq!(counter.next(), Some(5));
    assert_eq!(counter.next(), None);
}

#[test]
fn using_other_iterator_trait_methods() {
    //1*2
    //2*3
    //3*4
    //4*5
    let sum1: u32 = Counter::new().zip(Counter::new().skip(1)).map(|(a, b)| a * b).sum();
    println!("sum1:{}",sum1);

    //2*3+3*4+5*None
    let sum: u32 = Counter::new()
        .zip(Counter::new().skip(1)) //zip将两个迭代器压缩到一起
        .map(|(a, b)| a * b)
        .filter(|x| x % 3 == 0)
        .sum();
    assert_eq!(18, sum);
}


fn test_lambda(){
    let add = |a:i32,b:i32| -> i32 {a+b};
    println!("{:?}",add(1,2));
}

3


trait Any{
    fn any(&self,f:&(Fn(u32) -> bool)) -> bool;
}

impl Any for Vec<u32> {
    fn any(&self,f:&(Fn(u32) -> bool)) -> bool {
        for &x in self.iter() {
            if f(x) {
                return true;
            }
        }
        false
    }
}

fn test_any(){
    let v = vec![1,2,3];
    let b = v.any(&|x| x==3);
    println!("{:?}",b);
}

v:1 v:0 
分享到:
评论

相关推荐

    Rust学习笔记_78实用知识库分享

    7. Rust闭包:Rust学习笔记Day 23-24讲述了Rust的闭包,包括闭包的定义、闭包的使用场景、闭包的实现等。 8. Rust库和生态系统:Rust学习笔记Day 25讲述了Rust的库和生态系统,包括Rust的标准库、 THIRD-PARTY库和...

    详解 Rust 的函数与闭包.pdf

    ### 详解 Rust 的函数与闭包 #### 一、引言 在现代系统级编程语言中,Rust 以其安全性和高效性而闻名。Rust 不仅提供了强大的内存管理功能,还支持函数式编程特性,如函数、闭包、高阶函数等。本文将详细介绍 Rust ...

    wasm-mt:用于Rust和WebAssembly的多线程库

    您可以简单地使用Rust闭包对线程进行编程,并使用async/await对其进行编排。例子wasm-mt-pool wasm-mt基于wasm-mt线程池库。 [| ] 您可以在浏览器中运行以下所有应用! EXEC -如何使用wasm_mt 。 [| ] fib-使用嵌套...

    rust-book-chinese.zip_Rust编程_rust_rust 中文手册_rust系统

    这份中文手册包含了Rust语言的各个方面,包括基础语法、类型系统、内存管理、所有权模型、生命周期、闭包、模块系统、错误处理、泛型、宏、标准库以及系统编程和跨平台编译等内容。 1. **Rust基础语法**:Rust的...

    Rust编程艺术:迭代器与闭包的精妙运用

    ### Rust 编程艺术:迭代器与闭包的精妙运用 #### 一、Rust 语言概述 Rust 是一种高性能的系统级编程语言,它由 Mozilla 研究院发起,Graydon Hoare 设计,并于 2010 年首次发布。Rust 的设计目标在于提供内存安全...

    探索Rust的迭代器与闭包:高效编程的双剑

    5. **现代语言特性**:Rust提供了模式匹配、闭包、迭代器、错误处理等现代编程语言特性。 6. **跨平台**:Rust支持跨平台开发,可以在多种操作系统上编译和运行。 7. **包管理**:Rust有一个强大的包管理器和构建...

    Rust参考手册 中文版(带完整目录)

    3. **函数和闭包**:讲解Rust中的函数定义、参数传递、返回值以及匿名函数(闭包)。闭包在Rust中扮演着重要角色,可以用于函数式编程风格。 4. **模块系统**:阐述如何组织代码,包括模块、路径、可见性和包...

    Rust程序设计语言 中文版(带完整目录)

    3. 现代化:Rust是一种现代语言,提供了许多现代化的语言特性,例如泛型、闭包、迭代器等。 Rust的开发工具 1. rustc:Rust的编译器,可以将Rust代码编译成机器代码。 2. rustup:Rust的工具链管理器,可以管理...

    rust-in-action-code.tar.gz

    4. **函数与闭包**:Rust的函数可以接受闭包作为参数,闭包是一种可以捕获其环境的匿名函数。闭包的使用极大地增强了代码的灵活性和可读性。 5. **宏**:Rust的宏系统允许在编译时进行代码生成,增强了语言的表达...

    The Rust Programming Language (Covers Rust 2018).rar

    4. **函数与闭包**:Rust支持函数和匿名函数(闭包)。闭包可以捕获和存储其周围环境的引用,提供了强大的函数式编程特性。 5. **生命周期**:Rust中的生命周期是类型系统的一部分,用来表示引用的存活时间,确保...

    Rust语言入门教程&代码示例.pdf

    - **闭包**:闭包是一种函数,它可以捕获并记住其作用域内的变量。 - **迭代器**:迭代器提供了一种遍历集合元素的方式。 - **泛型**:允许编写能够接受不同类型的通用函数或结构体。 - **生命周期**:生命周期是 ...

    通过例子学rust 中文版 (rust team).pdf

    - **闭包**:捕获周围环境变量的匿名函数。 - **高阶函数**:接受函数作为参数或者返回函数的函数。 ##### 8. 模块 - **知识点**: - **模块定义**:使用`mod`关键字定义模块。 - **模块组织**:通过模块将代码...

    rust示例教程rust-by-example

    “Capturing”展示了闭包如何捕获其环境中的变量,这对于理解Rust的变量所有权模型非常重要。 Rust的“Iterator”和“Higher Order Functions”部分介绍了迭代器和高阶函数的概念,它们是函数式编程范式中的重要...

    学习Rust需要的词库.xls

    Rust的闭包分为三类:`Fn`(只读),`FnMut`(可变),`FnOnce`(只能调用一次)。 11. **泛型(Generics)**: 泛型允许编写可重用的代码,适用于多种类型。 12. **trait(特性)**: 特性定义了类型必须实现的方法...

    Rust 学习笔记.zip

    3. **函数和闭包**:Rust中的函数可以有默认参数、可变参数和返回多个值。闭包(Closures)是匿名函数,可以捕获其所在作用域的变量,这在处理异步操作和迭代时非常有用。 4. **模式匹配**:Rust的模式匹配是其强大...

    通过例子学Rust 中文版(带完整目录)

    8. **其他高级特性**:Rust还提供了泛型、错误处理、模式匹配、闭包等高级特性,使得编写高效且安全的代码变得可能。 这本书通过323页的详细内容,逐步引导读者从基础到进阶,全面掌握Rust编程语言。通过实践和理解...

    RUST中文教程

    - **闭包**:Rust中的闭包是一种可以捕获外部环境变量的匿名函数。 #### 七、所有权 **所有权概念**: - **所有权机制**:Rust通过所有权模型来管理内存资源,确保资源被安全地分配和回收。 - **借用规则**:了解...

    rust-使用rust开发的机器学习算法-k-means+线性回归算法实现.zip

    此外,我们还需要熟悉Rust的函数式编程特性,例如闭包和迭代器,这些对于处理大规模数据和算法迭代非常有用。同时,Rust的错误处理机制也非常重要,确保在执行过程中遇到问题时能够优雅地失败并提供有用的错误信息。...

    rust-book.pdf

    - 高级特性:包括宏、闭包、迭代器等高级主题。 - Rust生态系统:包括如何使用 crates.io 上的包,以及如何编写和发布自己的crates。 - 系统编程:Rust作为系统编程语言的特性,比如直接与操作系统交互的能力。 - ...

    编程锈2:epub.rust

    闭包在Rust中是第一类公民,可以在任何地方存储和传递。 Rust的类型系统十分强大,支持枚举(enum)和结构体(struct)。枚举可以表示一系列相关的值,而结构体则用于封装相关数据。Rust还提供了模式匹配功能,使得...

Global site tag (gtag.js) - Google Analytics