gpt4 book ai didi

rust - 未装箱的闭包的错误消息

转载 作者:行者123 更新时间:2023-11-29 08:22:05 25 4
gpt4 key购买 nike

这个使用未装箱闭包的 FizzBu​​zz 小程序给出了一个相当神秘的错误消息。

fn fizzbuzz<F: Fn(i64) -> bool>(n: i64, f: F, fs: &str, b: F, bs: &str) {
for i in range(1i64, n+1) {
match (f(i), b(i)) {
(true, true) => println!("{:3}: {}{}", i, fs, bs),
(true, _) => println!("{:3}: {}", i, fs),
(_, true) => println!("{:3}: {}", i, bs),
_ => (),
}
}
}

fn main() {
fizzbuzz(30,
|&: i: i64| { i % 3 == 0 }, "fizz",
|&: j: i64| { j % 5 == 0 }, "buzz");
}

错误信息:

<anon>:15:14: 15:40 error: mismatched types: expected `closure[<anon>:14:14: 14:40]`, found `closure[<anon>:15:14: 15:40]` (expected closure, found a different closure)
<anon>:15 |&: j: i64| { j % 5 == 0 }, "buzz");
^~~~~~~~~~~~~~~~~~~~~~~~~~
error: aborting due to previous error

有人可以描述错误吗?谢谢。

最佳答案

这段代码演示了问题的本质:

fn show_both<S: Show>(x: S, y: S) {
println!("{} {}", x, y);
}

您只能使用相同类型的两个参数调用它,即这是允许的:

let x: i32 = 10;
let y: i32 = 20;
show_both(x, y);

但这不是:

let x: i32 = 10;
let y: f64 = 20.0;
show_both(x, y);

这很自然:您指定两个参数 必须是同一类型,即使这种类型可以是任意的,只要它实现了Show

你的代码中有本质上相同的东西:

fn fizzbuzz<F: Fn(i64) -> bool>(n: i64, f: F, fs: &str, b: F, bs: &str)

您声明fb 必须相同的类型。然而,对于每个未装箱的闭包,编译器生成一个不同类型 - 这也是很自然的,因为不同的闭包可以捕获不同的变量。

你需要指定不同的类型参数才能传递不同的闭包:

fn fizzbuzz<F1, F2>(n: i64, f: F1, fs: &str, b: F2, bs: &str)
where F1: Fn(i64) -> bool,
F2: Fn(i64) -> bool

关于rust - 未装箱的闭包的错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27867765/

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