如何解决用于right = | _a |的Rust泛型类型实现| b | b
在TypeScript中,我这样做:
const right = <T>(a: T) => <U>(b: U) => b;
const log = (msg: unknown) =>
right
(console.log(msg))
(msg);
log(1); //1
log("hello"); //"hello"
log(right(1)(2)); //2
现在,我想用通用类型在Rust中实现相同的代码。
let right = |_a| |b| b;
let log = |msg| right(println!("{:?}",msg))(msg);
log(1); //1
log("hello"); //compile error
log(right(1)(2)); //compile error
到目前为止,编译错误是这样的,我知道错误发生的原因和方式,而且我知道这不是使用泛型的代码。
所以我的问题是,使用通用类型关闭在Rust中实现此功能的合适代码是什么?谢谢。
解决方法
这里的问题是您的闭包不是通用的。实际上,它们固定为特定类型,并且可以推断出那些类型。第一次使用时,编译器将它们分配一次,然后与以后的使用不匹配。
如果要使用泛型类型,最好使用显式函数而不是闭包:
Django
这些函数是显式泛型的,并且具有适当的类型,因此对于每个实例化,它们将被适当地化。如果您对这些功能的扩展范围感到不满意,可以将它们推入fn right<T,U>(_x: T) -> impl Fn(U) -> U {
|b| b
}
fn log<T: std::fmt::Debug>(msg: T) {
right(println!("{:?}",msg))(msg);
}
fn main() {
log(1); // 1
log("hello"); // hello
log(right(1)(2)); // 2
}
,它们只能从那里看到,就像您的闭包一样。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。