为什么要求将大小传递给泛型类型参数?

滑溜溜的

当我在Rust操场上运行以下代码时...

fn take_part_1<'a>(s: &'a str) -> &'a str {
    s.split(':').next().unwrap()
}

fn take_part_2<'a, T: 'a + AsRef<str>>(s: &'a T) -> &'a str {
    let b = s.as_ref().split(':').next().unwrap();
    b
}

fn main() {
    println!("{}", take_part_1("a:b"));
    println!("{}", take_part_2("a:b"));
}

...编译器返回没有意义的错误:

12 |     println!("{}", take_part_2("a:b"));
   |                    ^^^^^^^^^^^ doesn't have a size known at compile-time
   |
   = help: the trait `std::marker::Sized` is not implemented for `str`

我可以这样添加来修复它?Sized

fn take_part_2<'a, T: 'a + AsRef<str> + ?Sized>(s: &'a T) -> &'a str {

为什么?Sized要这样做(为什么编译器将错误指向函数调用)?它有什么作用?我是否应该能够将引用传递给未缩放的对象并使其正常工作?

令我感到困惑的是,非通用实现按您的预期工作,没有任何要求?Sized(即使编译器指出str不是Sized!)

彼得·霍尔

在大多数使用类型参数的地方,Rust会隐式插入一个附加Sized界限。那是因为这是最常见的情况-如果它不以这种方式运行,那么您将不得不在任何地方写装订自己,这样会造成重复和嘈杂。

例如,您的take_part函数与此完全相同:

fn take_part_2<'a, T: 'a + AsRef<str> + Sized>(s: &'a T) -> &'a str {
    let b = s.as_ref().split(':').next().unwrap();
    b
}

然而,你的函数的实现并不需要TSized因为它只是有史以来参考使用它。: ?Sized有效地添加将消除该隐式边界,并向类型检查器传达T不需要知道其大小的信息,因此您的功能应尽可能通用。在这种情况下,使其更具通用性,则可以使用动态大小类型Tas调用它str

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Java

为什么我不能显式地将类型参数传递给泛型Java方法?

来自分类Dev

为什么C ++允许在运行时将数组大小传递给函数以构造固定大小的数组?

来自分类Dev

DryIoC根据泛型类型参数将参数传递给开放泛型服务的构造函数

来自分类Dev

将泛型参数传递给方法

来自分类Dev

将泛型类型传递给方法

来自分类Dev

为什么 PHP 要求将参数传递给匿名类?

来自分类Java

将类型参数作为类型参数的类传递给Java中的泛型方法

来自分类Java

将泛型参数传递给类的方法或将方法的结果转换为给定的泛型类型?

来自分类Dev

将二维数组的大小传递给函数?

来自分类Dev

将函数及其大小传递给WriteFile

来自分类Dev

如何将数量不确定的类型参数传递给泛型方法?

来自分类Dev

如何将类型参数传递给泛型类构造函数引用?

来自分类Dev

通过将 Unit 作为类型传递给泛型特征的可选方法参数

来自分类Dev

将泛型枚举类型作为参数传递给 Typescript 中的函数

来自分类Dev

为什么我不能将类型传递给泛型方法

来自分类Dev

将属性的类型传递给泛型类型

来自分类Dev

是否可以从传递给函数的参数返回泛型类型

来自分类Dev

为什么我允许将泛型类型的边界类型的对象传递给函数,但不允许返回它?

来自分类Dev

为什么Java允许将原始List传递给泛型List构造函数?

来自分类Dev

将泛型类型类传递给方法

来自分类Dev

将实体框架类型传递给泛型方法

来自分类Dev

C#将类类型的字典传递给泛型

来自分类Dev

将泛型类型传递给Typescript中的mixins

来自分类Dev

将变量ViewModel类型作为泛型传递给方法

来自分类Dev

将typeof(x)类型传递给泛型方法

来自分类Dev

将(本地)变量作为类型传递给泛型方法

来自分类Dev

如何将类型(泛型)传递给注释?

来自分类Dev

将变量类型作为泛型传递给递归工厂

来自分类Dev

为什么将数组的大小作为参数传递给函数时,数组的大小为何不同

Related 相关文章

  1. 1

    为什么我不能显式地将类型参数传递给泛型Java方法?

  2. 2

    为什么C ++允许在运行时将数组大小传递给函数以构造固定大小的数组?

  3. 3

    DryIoC根据泛型类型参数将参数传递给开放泛型服务的构造函数

  4. 4

    将泛型参数传递给方法

  5. 5

    将泛型类型传递给方法

  6. 6

    为什么 PHP 要求将参数传递给匿名类?

  7. 7

    将类型参数作为类型参数的类传递给Java中的泛型方法

  8. 8

    将泛型参数传递给类的方法或将方法的结果转换为给定的泛型类型?

  9. 9

    将二维数组的大小传递给函数?

  10. 10

    将函数及其大小传递给WriteFile

  11. 11

    如何将数量不确定的类型参数传递给泛型方法?

  12. 12

    如何将类型参数传递给泛型类构造函数引用?

  13. 13

    通过将 Unit 作为类型传递给泛型特征的可选方法参数

  14. 14

    将泛型枚举类型作为参数传递给 Typescript 中的函数

  15. 15

    为什么我不能将类型传递给泛型方法

  16. 16

    将属性的类型传递给泛型类型

  17. 17

    是否可以从传递给函数的参数返回泛型类型

  18. 18

    为什么我允许将泛型类型的边界类型的对象传递给函数,但不允许返回它?

  19. 19

    为什么Java允许将原始List传递给泛型List构造函数?

  20. 20

    将泛型类型类传递给方法

  21. 21

    将实体框架类型传递给泛型方法

  22. 22

    C#将类类型的字典传递给泛型

  23. 23

    将泛型类型传递给Typescript中的mixins

  24. 24

    将变量ViewModel类型作为泛型传递给方法

  25. 25

    将typeof(x)类型传递给泛型方法

  26. 26

    将(本地)变量作为类型传递给泛型方法

  27. 27

    如何将类型(泛型)传递给注释?

  28. 28

    将变量类型作为泛型传递给递归工厂

  29. 29

    为什么将数组的大小作为参数传递给函数时,数组的大小为何不同

热门标签

归档