#binding #argument #parameters #bind

no-std partial_application

通过 partial! 宏进行部分函数应用

3 个不稳定版本

使用旧 Rust 2015

0.2.1 2020年7月30日
0.2.0 2019年9月23日
0.1.0 2018年2月26日

614Rust 模式

Download history 277/week @ 2024-03-24 333/week @ 2024-03-31 315/week @ 2024-04-07 253/week @ 2024-04-14 214/week @ 2024-04-21 180/week @ 2024-04-28 154/week @ 2024-05-05 171/week @ 2024-05-12 243/week @ 2024-05-19 554/week @ 2024-05-26 489/week @ 2024-06-02 433/week @ 2024-06-09 411/week @ 2024-06-16 433/week @ 2024-06-23 288/week @ 2024-06-30 404/week @ 2024-07-07

1,554 每月下载量
用于 12 个包 (9 个直接)

MIT/Apache

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);

如果创建开销大或存在不希望的外部效应,请预先计算要固定的参数,并在局部变量中存储。

您还可以使用逗号 (,) 或分号 (;) 来代替箭头 (=>)。这种奇特的语法选择是由于宏系统强加的限制。不允许在函数表达式标记之后跟随其他标记。

无运行时依赖