3 个不稳定版本
使用旧 Rust 2015
0.2.1 | 2020年7月30日 |
---|---|
0.2.0 | 2019年9月23日 |
0.1.0 | 2018年2月26日 |
614 在 Rust 模式
1,554 每月下载量
用于 12 个包 (9 个直接)
11KB
122 行
partial_application
partial!
宏允许对函数进行部分应用。
partial!(some_fn => arg0, _, arg2, _)
返回闭包 |x1, x3| some_fn(arg0, x1, arg2, x3)
。
通过在函数前添加 move
创建移动闭包: partial!(move ..)
use partial_application::partial;
// When you're using the 2015 edition of Rust, you need to import the macro like this
#[macro_use]
extern crate partial_application;
fn foo(a: i32, b: i32, c: i32, d: i32, mul: i32, off: i32) -> i32 {
(a + b*b + c.pow(3) + d.pow(4)) * mul - off
}
fn main() {
let bar = partial!(foo => _, _, 10, 42, 10, 10);
assert_eq!(
foo(15, 15, 10, 42, 10, 10),
bar(15, 15)
);
}
lib.rs
:
partial!
宏允许对函数进行部分应用。
partial!(some_fn => arg0, _, arg2, _)
返回闭包 |x1, x3| some_fn(arg0, x1, arg2, x3)
。
通过在函数前添加 move
创建移动闭包: partial!(move ..)
#[macro_use]
extern crate partial_application;
fn foo(a: i32, b: i32, c: i32, d: i32, mul: i32, off: i32) -> i32 {
(a + b*b + c.pow(3) + d.pow(4)) * mul - off
}
fn main() {
let bar = partial!(foo => _, _, 10, _, 10, 10);
assert_eq!(
foo(15, 15, 10, 42, 10, 10),
bar(15, 15, 42)
);
}
由于宏背后的简单转换,用于固定参数的表达式在调用新函数时会被重新评估。
#
fn identity(x: u32) -> u32 { x }
let mut n = 0;
let mut f = partial!(identity => { n += 1; n});
assert_eq!(f(), 1);
assert_eq!(f(), 2);
如果创建开销大或存在不希望的外部效应,请预先计算要固定的参数,并在局部变量中存储。
您还可以使用逗号 (,
) 或分号 (;
) 来代替箭头 (=>
)。这种奇特的语法选择是由于宏系统强加的限制。不允许在函数表达式标记之后跟随其他标记。