【问题标题】:Why can't I return the generic type T from this function? [duplicate]为什么我不能从这个函数返回泛型类型 T? [复制]
【发布时间】:2021-02-15 23:10:22
【问题描述】:

我想返回引用类型,但是第一个make_debug 函数实现没有编译。此函数签名的返回类型使用Timpl std::fmt::Debug 有什么区别?

fn test() -> impl std::fmt::Debug + 'static {
    let value = "v".to_string();
    make_debug(&value)
}

// This function not work
// fn make_debug<'a, T: std::fmt::Debug>(_: &'a T) -> T {
//     42u8
// }

// This one works well
fn make_debug<'a, T: std::fmt::Debug>(_: &'a T) -> impl std::fmt::Debug {
    42u8
}

Playground

【问题讨论】:

  • 一个小时前有一个类似的question
  • 这是因为想象make_debug::&lt;String&gt;(123)。然后 make_debug 将返回 String 但您正试图返回 u8
  • 是的,谢谢,我明白了。 @pretzelhammer

标签: rust


【解决方案1】:

使用-&gt; impl std::fmt::Debug 的意思是“嘿,我要返回一个实现调试的类型,但我不知道那个类型是什么”。

在使用-&gt; T 时,意味着“嘿,我要返回一些 T 类型的东西,它恰好实现了 Debug”

所以区别在于,在第一种情况下,您可以返回与输入不同的类型,只要它实现了 Debug 特征,它就可以工作。而在第二种情况下,您必须返回与输入相同类型的内容。

【讨论】:

  • 我觉得这个解释令人困惑:-&gt; impl Debug 函数 does 知道具体类型是什么,而 caller 不知道.而泛型则相反:调用者知道T 是什么,但被调用者不知道(在单态化之前)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-13
  • 1970-01-01
  • 2013-03-22
  • 1970-01-01
  • 1970-01-01
  • 2011-05-18
  • 1970-01-01
相关资源
最近更新 更多