1个不稳定版本
0.1.0 | 2020年5月5日 |
---|
#1390 在 过程宏
6KB
82 代码行
cutlass
为Rust函数提供实验性自动柯里化
示例
此功能目前仅在nightly版本中启用type_alias_impl_trait
功能时才有效。
#![feature(type_alias_impl_trait)]
#[cutlass::curry]
fn add(x: u32, y: u32, z: u32) -> u32 {
return x + y + z;
}
fn main() {
let plus_3 = add(1)(2);
let v: Vec<u32> = (1..=3).map(plus_3).collect();
assert_eq!(v, vec![4, 5, 6]);
}
工作原理
以下代码中的#[curry]
过程宏将上述add
函数扩展为类似以下内容(大致)
type T0 = u32;
type T1 = impl Fn(u32) -> T0;
type T2 = impl Fn(u32) -> T1;
fn add(x: u32) -> T2 {
return (move |y| move |z| x + y + z);
}
注意事项
- 目前不支持方法函数(带有
self
签名的函数) - 函数必须有一个返回值
- 仅在nightly版本中启用
type_alias_impl_trait
时才有效
测试
使用cargo +nightly test
测试此crate。
要查看宏展开,安装cargo-expand
并运行cargo expand --test <test name>
. 以expand tests/smoke.rs
为例
cargo expand --test smoke
依赖
~1.5MB
~35K SLoC