Generics 如何专门化函数';返回值是多少?
下面的代码块是库代码;我无法编辑它:Generics 如何专门化函数';返回值是多少?,generics,rust,Generics,Rust,下面的代码块是库代码;我无法编辑它: struct Container<F> { f: F, } fn wrapped<F, T>(f: F) -> Container<F> where F: FnMut() -> T, { Container { f } } (为了简单起见,我在上面的代码中使用了u32,但实际上我想使用一个trait。我希望这不重要。) 它不起作用: 错误[E0308]:类型不匹配 -->src/ma
struct Container<F> {
f: F,
}
fn wrapped<F, T>(f: F) -> Container<F>
where
F: FnMut() -> T,
{
Container { f }
}
(为了简单起见,我在上面的代码中使用了u32
,但实际上我想使用一个trait。我希望这不重要。)
它不起作用:
错误[E0308]:类型不匹配
-->src/main.rs:20:13
|
20 |包装(返回| 10)
|^^^^^^应为类型参数,找到fn项
|
=注意:应为'F'类型`
找到类型`fn()->u32{return_10}`
为什么Rust不能推断出
t=u32
?我不应该这样做吗?我不确定这是否是您要找的,但这段代码可以编译
struct Container<F> {
f: F,
}
fn wrapped<F, T>(f: F) -> Container<F>
where
F: FnMut() -> T,
{
Container { f }
}
fn return_10() -> u32 {
10
}
fn wrapper() -> Container<fn() -> u32> {
wrapped(return_10)
}
fn main() {
wrapper();
}
struct容器{
f:f,
}
fn包装(f:f)->容器
哪里
F:FnMut()->T,
{
容器{f}
}
fn返回_10()->u32{
10
}
fn包装器()->容器u32>{
已包装(返回10)
}
fn main(){
包装器();
}
我通过使用下面的代码强制编译器发出一条消息,告诉我它所期望的类型,从而解决了这个问题
struct Container<F> {
f: F,
}
fn wrapped<F, T>(f: F) -> Container<F>
where
F: FnMut() -> T,
{
Container { f }
}
fn return_10() -> u32 {
10
}
fn main() {
let x: () = wrapped(return_10);
}
struct容器{
f:f,
}
fn包装(f:f)->容器
哪里
F:FnMut()->T,
{
容器{f}
}
fn返回_10()->u32{
10
}
fn main(){
设x:()=包裹(返回_10);
}
编译上面的代码时,编译器会抱怨
错误[E0308]:类型不匹配
-->src/main.rs:17:17
|
17 |设x:()=包裹(返回| 10);
|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^`
|
=注意:应为类型“”()`
找到类型`Container u32{return_10}>`
我不确定这是否是您要找的,但这段代码可以编译
struct Container<F> {
f: F,
}
fn wrapped<F, T>(f: F) -> Container<F>
where
F: FnMut() -> T,
{
Container { f }
}
fn return_10() -> u32 {
10
}
fn wrapper() -> Container<fn() -> u32> {
wrapped(return_10)
}
fn main() {
wrapper();
}
struct容器{
f:f,
}
fn包装(f:f)->容器
哪里
F:FnMut()->T,
{
容器{f}
}
fn返回_10()->u32{
10
}
fn包装器()->容器u32>{
已包装(返回10)
}
fn main(){
包装器();
}
我通过使用下面的代码强制编译器发出一条消息,告诉我它所期望的类型,从而解决了这个问题
struct Container<F> {
f: F,
}
fn wrapped<F, T>(f: F) -> Container<F>
where
F: FnMut() -> T,
{
Container { f }
}
fn return_10() -> u32 {
10
}
fn main() {
let x: () = wrapped(return_10);
}
struct容器{
f:f,
}
fn包装(f:f)->容器
哪里
F:FnMut()->T,
{
容器{f}
}
fn返回_10()->u32{
10
}
fn main(){
设x:()=包裹(返回_10);
}
编译上面的代码时,编译器会抱怨
错误[E0308]:类型不匹配
-->src/main.rs:17:17
|
17 |设x:()=包裹(返回| 10);
|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^`
|
=注意:应为类型“”()`
找到类型`Container u32{return_10}>`
当您编写这样的函数签名时:
fn wrapper<F>() -> Container<F>
where
F: FnMut() -> u32;
这意味着:
我将返回一个容器
F
将实现Fn()->u32
但是我将选择具体的类型
当您编写这样的函数签名时:
fn wrapper<F>() -> Container<F>
where
F: FnMut() -> u32;
这意味着:
我将返回一个容器
F
将实现Fn()->u32
但是我将选择具体的类型
我相信你的问题得到了我的回答。如果你不同意,请用你的问题来解释不同之处。否则,我们可以将此问题标记为已回答。TL;DR:
fn wrapper()->Container u32>{wrapped(return_10)}
或fn wrapper()->Container u32>{wrapped(return_10)}
@Shepmaster Well,有一个问题是,T>
语法在中似乎不存在,如果没有下面的答案,我可能永远也找不到它…@Shepmaster我确实看到了那篇文章,它对我没有帮助;即使是现在。我相信你的问题已经得到了我的答案。如果你不同意,请用你的问题来解释不同之处。否则,我们可以将此问题标记为已回答。TL;DR:fn wrapper()->Container u32>{wrapped(return_10)}
或fn wrapper()->Container u32>{wrapped(return_10)}
@Shepmaster Well,有一个问题是,T>
语法在中似乎不存在,如果没有下面的答案,我可能永远也找不到它…@Shepmaster我确实看到了那篇文章,它对我没有帮助;即使是现在,也很有趣。但是,您怎么知道可以通过分配wrapped()
的结果来获得此建议呢?原始错误指向参数。。。它出现在同一行中。。。但也是一种。。。“无关”?啊,我知道wrapper
的返回类型存在问题,它必须与wrapped(return_10)
的返回类型相同。但是,您怎么知道可以通过分配wrapped()
的结果来获得此建议呢?原始错误指向参数。。。它出现在同一行中。。。但也是一种。。。“无关”?啊,我知道wrapper
的返回类型存在问题,它必须与wrapped(return_10)
的返回类型相同