【Rust每周一知】一种奇怪的表示 T::Item

2024-06-23 00:32

本文主要是介绍【Rust每周一知】一种奇怪的表示 T::Item,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我们都知道,Rust有一种叫 完全限定语法(fully-qualified syntax) 的东西。请看下面的例子:

trait AAA {type Item;fn test();
}struct Foo;impl AAA for Foo {type Item = String;fn test() {println!("a test.");}
}fn main() {let f: Foo::Item= String::from("test foo");println!("{}", f);
}

编译,会提示如下错误:

error[E0223]: ambiguous associated type--> src/main1.rs:20:12|
20 |     let f: Foo::Item= String::from("test foo");|            ^^^^^^^^^ help: use fully-qualified syntax: `<Foo as Trait>::Item`

应该写成:

let f: <Foo as AAA>::Item= String::from("test foo");

就可以编译通过了,这就是所谓:完全限定语法。

但是,在阅读一些工程的代码的时候,可以发现一种不寻常的用法。我设计了一个例子如下:

trait AAA {type Item0;fn test();
}impl<T> AAA for T {type Item0 = String;fn test() {println!("test it");}
}trait BBB {type Item1;fn doit(&self);
}struct Foo<T> {foo: T
}impl<T> BBB for Foo<T>
whereT: AAA
{type Item1 = T::Item0;fn doit(&self) {println!("just do it.");}
}fn main() {let f = Foo::<u8>{foo: 100};f.doit();
}

上面例子中,T::Item0 这个写法,有点超出我们的认知。泛型可以直接引用其 Trait bound 的 associated type 吗?好像是的。本例子能编译通过并顺利运行。

再来看一个稍微复杂一点的例子:

struct Doubler<I> {iter: I,
}impl<I> Iterator for Doubler<I> whereI: Iterator,I::Item: std::ops::Add<Output=I::Item> + Copy,
{type Item = I::Item;fn next(&mut self) -> Option<Self::Item> {match self.iter.next() {None => None,Some(x) => Some(x + x),}}
}fn sum(range: u32) -> u32 {(1..=range).fold(0, |sum, i| sum + i)
}fn sum2<I>(iter: I) -> I::Item whereI: Iterator,I::Item: std::ops::Add<Output=I::Item> + From<u8>,
{iter.fold(From::from(0u8), std::ops::Add::add)
}fn main() {for i in (Doubler{iter: 1..11u32}) {print!("{} ", i);}println!();println!("Sum is {}", (1..11).fold(0, |sum, i| sum + i));println!("Sum is {} using sum helper", sum(10));println!("Sum is {} using sum good helper", sum2(0..11));println!("ALL DONE");
}

上例中的 I::Item 也是这种情况。

其实也并不难理解,只是在第一次遇到的时候,会很奇怪,Rust 怎么会有这种语法。于是设计了例子来验证这个问题。原来还真是可以的。

本文所有示例地址: https://github.com/daogangtang/learn-rust/tree/master/04generic_with_associated_type

这篇关于【Rust每周一知】一种奇怪的表示 T::Item的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1085830

相关文章

【Rust练习】12.枚举

练习题来自:https://practice-zh.course.rs/compound-types/enum.html 1 // 修复错误enum Number {Zero,One,Two,}enum Number1 {Zero = 0,One,Two,}// C语言风格的枚举定义enum Number2 {Zero = 0.0,One = 1.0,Two = 2.0,}fn m

linux中使用rust语言在不同进程之间通信

第一种:使用mmap映射相同文件 fn main() {let pid = std::process::id();println!(

一种改进的red5集群方案的应用、基于Red5服务器集群负载均衡调度算法研究

转自: 一种改进的red5集群方案的应用: http://wenku.baidu.com/link?url=jYQ1wNwHVBqJ-5XCYq0PRligp6Y5q6BYXyISUsF56My8DP8dc9CZ4pZvpPz1abxJn8fojMrL0IyfmMHStpvkotqC1RWlRMGnzVL1X4IPOa_  基于Red5服务器集群负载均衡调度算法研究 http://ww

GitHub每周最火火火项目(9.2-9.8)

项目名称:polarsource / polar 项目介绍:polar 是一个开源项目,它是 Lemon Squeezy 的替代方案,并且具有更具优势的价格。该项目的目标是为开发者提供一种更好的选择,让他们能够在追求自己的热情和兴趣的同时,通过编码获得相应的报酬。通过使用 polar,开发者可以享受到更实惠的价格,同时也能够更自由地发挥自己的创造力和技能。 项目地址:https://github.

第二十四章 rust中的运算符重载

注意 本系列文章已升级、转移至我的自建站点中,本章原文为:rust中的运算符重载 目录 注意一、前言二、基本使用三、常用运算符四、通用约束 一、前言 C/C++中有运算符重载这一概念,它的目的是让即使含不相干的内容也能通过我们自定义的方法进行运算符操作运算。 比如字符串本身是不能相加的,但由于C++中的String重载了运算符+,所以我们就可以将两个字符串进行相加、但实际

一种快速生成CSV的方法

事情是这个样子的 在QQ群在聊把如何100万数据导出成CSV文件?会不会很慢? 俺回了一句“现在的机器性能好,没啥问题”。 然后大家开始谈论机器的配置了。哎,俺的机器配置有点差。 然后俺就进行了一个测试。 测试数据 数据定义         public struct Rec         {             public int v1;             publi

从计组中从重温C中浮点数表示及C程序翻译过程

目录 移码​编辑  传统浮点表示格式 浮点数的存储(ieee 754)->修炼内功 例子:   ​编辑 浮点数取的过程   C程序翻译过程 移码  传统浮点表示格式 浮点数的存储(ieee 754)->修炼内功 根据国际标准IEEE(电⽓和电⼦⼯程协会)  32位 例子:    64位    IEEE754对有效数字M和

【Rust光年纪】Rust 机器人学库全景:功能、安装与API概览

机器人学+Rust语言=无限可能:六款库带你开启创新之旅! 前言 随着机器人技术的快速发展,对于机器人学领域的高效、可靠的编程语言和库的需求也日益增加。本文将探讨一些用于 Rust 语言的机器人学库,以及它们的核心功能、使用场景、安装配置和 API 概览,旨在为机器人学爱好者和开发人员提供参考和指导。 欢迎订阅专栏:Rust光年纪 文章目录 机器人学+Rust语言=无限可能:

【Visual Studio 报错】未加载 wntdll.pdb(一种可行的解决办法)

调试程序时,会出现下面这个报错 分析原因: 出现未加载 wntdll.pdb 报错大概率是你的指针使用错误 ,比如使用野指针、越界访问、或者堆区空间释放方式错误等。 这里以 堆区空间释放方式错误 为例子 1、堆区开辟的数组空间使用 delete 释放 // 堆区开辟的数组空间使用 delete 释放int* p = new int[10];delete p; 正

第二十二章 rust数据库使用:sea-orm详解

注意 本系列文章已升级、转移至我的自建站点中,本章原文为:rust数据库使用:sea-orm详解 目录 注意一、前言二、项目管理三、迁移文件四、实体文件五、业务使用 一、前言 只要开发稍微大型一点的项目,数据库都是离不开的。 rust目前并没有特别成熟的数据库框架,sea-orm这个框架是我目前所看到的成熟度最高的一个,并且仍在积极开发中。 所以本文将以sea-orm框