gpt4 book ai didi

closures - 函数类型vs闭包类型

转载 作者:行者123 更新时间:2023-12-03 11:38:47 26 4
gpt4 key购买 nike

我想创建一个函数向量

let all_rerankers =  vec![ match_full
, match_partial
, match_regex
, match_camel_case
];

但是, match_camel_case比其他函数需要更多的参数,因此尽管我可以为 match_camel_case定义一个闭包
// 3 is the extra parameter needed by match_camel_case
let close_camel_case = |str: &str, keyword: &str| {
match_camel_case(str, keyword, 3)
};

然后指定我的向量的类型:
let all_rerankers: Vec<|str: &str, kwd: &str| -> MatchScore>
= vec![ match_full
, match_partial
, match_regex
, close_camel_case
];

但是编译它后,我发现Rust对待它们的方式有所不同:
mismatched types: expected `fn(&str, &str) -> MatchScore`, 
found `|&str, &str| -> MatchScore`
(expected extern fn, found fn)

close_camel_case
^~~~~~~~~~~~~~~~

(以及我的 vec!宏中的类似类型错误)

似乎也可以区分 Fn类型和闭包类型。我可以通过将每个 match_*函数包装在一个闭包中来进行编译,但是我敢肯定有一个更好的解决方案。

问题:
  • 这里实际不匹配是什么?错误消息似乎建议Fn vs闭包类型,但是错误消息
  • 中也有 expected extern fn, found fn
  • 如何使类型匹配? (即,将闭包转换为fn类型,因为它是纯净的)

  • 我的rustc版本: rustc 0.12.0-pre-nightly (09cebc25a 2014-09-07 00:31:28 +0000)(可以根据需要进行升级)

    最佳答案

    这似乎是类型推断中的一些不幸问题。如果您这样做:

    let mut all_rerankers: Vec<|str: &str, kwd: &str| -> MatchScore> = Vec::new();
    all_rerankers.push(match_full);
    all_rerankers.push(match_partial);
    all_rerankers.push(match_regex);
    all_rerankers.push(close_camel_case);

    那一切都很好。复制是广泛的,但是您可以轻松编写一个其调用看起来像这样的宏:
    push_to!(all_rerankers;
    match_full,
    match_partial,
    match_regex,
    close_camel_case
    )

    这可能值得在 Rust bug tracker中创建一个问题,但是旧的闭包将很快被弃用,因此我不确定是否值得解决。

    关于closures - 函数类型vs闭包类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64376146/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com