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)
的返回类型相同