我不太了解这个特性,它可以将元组 struct 强制转换为函数,如下所示:

struct MyType(u8);

let optional_mytype: Option<MyType> = Some(12).map(MyType);
//                                                 ^^^^^^ here, MyType is treated as a function

在上面的例子中,不涉及生命周期:一切都很简单.然而,当 struct 有一个通用的生命周期界限时,我很难定义它将强制执行的函数的确切签名.

以下是我try 做的一些事情的MRE,但不起作用(sandbox link):

struct MyStruct<'a>(&'a ());

// This looks, to me, like the signature the "constructor" should have
type MyStructConstructor = for<'a> fn(&'a ()) -> MyStruct<'a>;

/// Coercion problem here
fn some_code() {
    let mut constructor: MyStructConstructor = MyStruct;
}

以及类型判断器给出的错误:

   Compiling playground v0.0.1 (/playground)
error[E0308]: mismatched types
 --> src/lib.rs:7:48
  |
7 |     let mut constructor: MyStructConstructor = MyStruct;
  |                                                ^^^^^^^^ one type is more general than the other
  |
  = note: expected fn pointer `for<'a> fn(&'a ()) -> MyStruct<'a>`
             found fn pointer `fn(&()) -> MyStruct<'_>`

我真的不明白为什么我的构造函数类型别名无效,为什么错误消息建议的类型比它应该的宽松得多.我的意思是,我的 struct 的生命周期<'a>应该与 struct 中包含的单元引用的生命周期<'a>完全相等,而不是随机的.

如果有上下文帮助的话,Here是一个更具体(仍然很小)的例子,说明我实际上在try 做什么.

提前谢谢

推荐答案

事实上,错误信息可能有点误导.'_并不意味着any个生命周期结束,它只意味着a lifetime I haven't named explicitly个生命周期,就像写&()个一样(与&'_ ()相同).Rust这样做是因为这不是问题所在.

为了理解,让我们在代码中实际注释隐式泛型生存期:

fn some_code() {
  let constructor: MyStructConstructor = MyStruct<'_>;
}

注意到有什么不对劲了吗?在右边,你有一个终生通用的类型.在左手边,你没有.

struct MyStruct<'a>(&'a ());

type MyStructConstructor<'a> = fn(&'a ()) -> MyStruct<'a>;

fn some_code() {
  let constructor: MyStructConstructor = MyStruct;
}

让生命变得含蓄——见the playground.

现在你可以理解为什么MyStructConstructorMyStruct更通用了:因为对于MyStruct,你必须指定一个生命周期,也就是说,对于给定的'aMyStruct<'a>,实际的类型是.然后,使用该构造函数,在给定&'a ()的情况下,您只能构建MyStruct<'a>类型的对象.另一方面,如果使用MyStructConstructor,参考()any的使用生命周期 ,则可以构建相同使用生命周期 的MyStruct,这更一般.

Rust相关问答推荐

如何定义使用拥有的字符串并返回拥有的Split的Rust函数?

在Rust中赋值变量有运行时开销吗?

类型批注需要静态生存期

如何修复&q;无法返回引用函数参数的值在异步规则中返回引用当前函数&q;拥有的数据的值?

无法实现整型类型的泛型FN

在Rust内联程序集中使用字符串常量

从管道读取后重置标准输入

随机函数不返回随机值

在 Rust 中,为什么 10 个字符的字符串的 size_of_val() 返回 24 个字节?

全面的 Rust Ch.16.2 - 使用捕获和 const 表达式的 struct 模式匹配

有什么办法可以追踪泛型的单态化过程吗?

如何在 Rust 中将枚举变体转换为 u8?

Rust:`sort_by` 多个条件,冗长的模式匹配

为什么不可变特征的实现可以是可变的?

将原始可变指针传递给 C FFI 后出现意外值

以 `static` 为前缀的闭包是什么意思?我什么时候使用它?

判断对象是 PyDatetime 还是 Pydate 的实例?

没有通用参数的通用返回

如何为枚举中的单个或多个值返回迭代器

为什么 `ref` 会导致此示例*取消引用*一个字段?