#macro #clucompany #no-std #enclose-macro

无 std enclose

一个方便的宏,用于将值克隆到闭包中

9 个版本 (4 个稳定版本)

1.2.0 2024年5月18日
1.1.8 2019年8月23日
1.1.6 2019年4月5日
0.1.4 2019年3月3日
0.1.1 2018年7月20日

开发工具 中排名 23

Download history 5084/week @ 2024-04-26 4860/week @ 2024-05-03 5105/week @ 2024-05-10 5259/week @ 2024-05-17 4329/week @ 2024-05-24 6004/week @ 2024-05-31 5665/week @ 2024-06-07 6859/week @ 2024-06-14 4645/week @ 2024-06-21 4240/week @ 2024-06-28 6232/week @ 2024-07-05 7158/week @ 2024-07-12 6748/week @ 2024-07-19 6330/week @ 2024-07-26 5332/week @ 2024-08-02 4884/week @ 2024-08-09

每月下载量 24,594
用于 61 个包 (13 个直接使用)

MIT/Apache 协议

23KB
273 行代码(不含注释)

[enclose]

(一个方便的宏,用于将值克隆到闭包中。)

用法

将以下内容添加到您的 Cargo.toml 文件中

[dependencies]
enclose = "1.2.0"

并将以下内容添加到您的源代码中

use enclose::enclose;

示例

EasyUse

直接使用即可!

use enclose::enclose;

fn main() {
	let clone_data = 0;
	let add_data = 100;
	
	my_enclose( enclose!((mut clone_data, add_data) || {
		// (mut clone_data, add_data) ->
		// let mut clone_data = clone_data.clone();
		// let add_data = add_data.clone();
		
		println!("#0 {:?}", clone_data);
		clone_data += add_data;
		println!("#1 {:?}", clone_data);
		
		assert_eq!(clone_data, 100);
	}));
	
	assert_eq!(clone_data, 0);
}

fn my_enclose<F: FnOnce() -> R, R>(a: F) -> R {
	a()
}

MutexUse

在多线程环境中创建闭包,无需额外代码!

use std::sync::Arc;
use std::sync::Mutex;
use std::thread;

use enclose::enclose;

fn main() {
	let mutex_data = Arc::new(Mutex::new( 0 ));
	let thread = thread::spawn( enclose!((mutex_data => d) move || {
		// (mutex_data => d) ->
		// let d = mutex_data.clone();
		
		let mut lock = match d.lock() {
			Ok(a) => a,
			Err(e) => e.into_inner(),
		};
		*lock += 1;
	}));

	thread.join().unwrap();
	{
		let lock = match mutex_data.lock() {
			Ok(a) => a,
			Err(e) => e.into_inner(),
		};
		assert_eq!(*lock, 1);
	}
}

ArcMutexUse

在多线程环境中使用 enclose 宏的更复杂示例。

use std::sync::Arc;
use std::sync::Mutex;
use std::sync::RwLock;
use std::thread;

use enclose::enclose;

fn main() {
	let data1 = Arc::new(Mutex::new( 0 ));
	let data2 = Arc::new(RwLock::new( (0, 2, 3, 4) ));

	let count_thread = 5;
	let mut waits = Vec::with_capacity(count_thread);

	for _a in 0..count_thread {
		waits.push({
			thread::spawn( enclose!((data1, data2) move || {
				// (data1, data2) -> 
				// let data1 = data1.clone();
				// let data2 = data2.clone();
				
				let mut v_lock = match data1.lock() {
					Ok(a) => a,
					Err(e) => e.into_inner(),
				};
				*v_lock += 1;

				drop( data2 ); // ignore warning
			}))
		});
	}
	for a in waits {
		a.join().unwrap();
	}
	
	
	{	
		// Check data1_lock
		let data1_lock = match data1.lock() {
			Ok(a) => a,
			Err(e) => e.into_inner(),
		};
		assert_eq!(*data1_lock, 5);
	}
	
	{	
		// Check data2_lock
		let data2_lock = match data2.write() {
			Ok(a) => a,
			Err(e) => e.into_inner(),
		};
		assert_eq!(*data2_lock, (0, 2, 3, 4));
	}
}

EasyCopy

使用拷贝而不是克隆。

use enclose::enclose;
use std::sync::Arc;

fn main() {
	let clone_data = Arc::new(0);
	let add_data = Arc::new(100);
	
	my_enclose( enclose!((mut *clone_data, *add_data) || {
		// (mut *clone_data, *add_data)
		// let mut clone_data = *clone_data;
		// let add_data = *add_data;
		
		println!("#0 {:?}", clone_data);
		clone_data += add_data;
		println!("#1 {:?}", clone_data);
		
		assert_eq!(clone_data, 100);
	}));
	
	assert_eq!(*clone_data, 0);
}

fn my_enclose<F: FnOnce() -> R, R>(a: F) -> R {
	a()
}
查看所有

许可证

本项目根据 (LICENSE-MIT) 和 (LICENSE-APACHE-2-0) 具有双重许可证。

uproject  版权 (c) 2019-2024 #UlinProject

 (Denis Kotlyarov).


Apache 许可证

apache2  根据 Apache License,版本 2.0 许可。



MIT 许可证

mit  根据 MIT 许可证许可。



无运行时依赖