rust-course/basic/trait/generic #709
Replies: 53 comments 78 replies
-
|
struct Point<T, U> { impl<T, U> Point<T, U> { fn main() { } |
Beta Was this translation helpful? Give feedback.
-
|
struct Point<T, U> { impl<T, U> Point<T, U> { fn main() { } 为什么self改为&self不可以 |
Beta Was this translation helpful? Give feedback.
-
|
我为啥觉得为了实现泛型 add 添加的 |
Beta Was this translation helpful? Give feedback.
-
|
Assert<{ core::mem::size_of::() < 768 }>: IsTrue, 这个 const泛型表达式,好丑,好难理解 |
Beta Was this translation helpful? Give feedback.
-
|
可与 TypeScript 的泛型一战否 🐶 |
Beta Was this translation helpful? Give feedback.
-
|
Beta Was this translation helpful? Give feedback.
-
|
吊打java泛型擦除 |
Beta Was this translation helpful? Give feedback.
-
|
largest方法跑不过 let mut largest = arr[0]; |
Beta Was this translation helpful? Give feedback.
-
|
fn display_array<T: std::fmt::Debug, const N: usize>(arr: [T; N]) {
println!("{}",N)
} |
Beta Was this translation helpful? Give feedback.
-
|
struct Point { impl Point { fn main() { 请问一下在x方法中,为什么最后需要返回&T类型呢?本地尝试了取消引用,提示cannot move out of |
Beta Was this translation helpful? Give feedback.
-
|
可以直接运行的largest方法, 加入 fn largest<T: PartialOrd + Copy>(list: &[T]) -> T {
let mut largest = list[0];
for &item in list.iter() {
{
if item > largest {
largest = item;
}
}
}
largest
} |
Beta Was this translation helpful? Give feedback.
-
Assert<{ core::mem::size_of::<T>() < 768 }>: IsTrue这个真的是我现在就能看的代码吗? 上一步还是1+1=2,下一步就要解二元一次方程😂 |
Beta Was this translation helpful? Give feedback.
-
|
个人觉得、 习题还需要优化一下 |
Beta Was this translation helpful? Give feedback.
-
|
刚从 |
Beta Was this translation helpful? Give feedback.
-
|
fn largest<T: std::cmp::PartialOrd>(list: &[T]) -> T { } 这段代码在最新的rust 1.64版本上依然无法编译通过,请高手指点下呢,谢谢 |
Beta Was this translation helpful? Give feedback.
-
|
已经开始昏头了 |
Beta Was this translation helpful? Give feedback.
-
有点迷糊这里在《Const 泛型》习题中,实例2给出了const泛型参数使用的三个条件:
fn foo<const N: usize>() {}
fn bar<T, const M: usize>() {
foo::<M>(); // ok: 符合第一种
foo::<2021>(); // ok: 符合第二种
foo::<{20 * 100 + 20 * 10 + 1}>(); // ok: 符合第三种
foo::<{ M + 1 }>(); // error: 违背第三种,const 表达式中不能有泛型参数 M
foo::<{ std::mem::size_of::<T>() }>(); // error: 泛型表达式包含了泛型参数 T
let _: [u8; M]; // ok: 符合第一种
let _: [u8; std::mem::size_of::<T>()]; // error: 泛型表达式包含了泛型参数 T
}
fn main() {}问题就来了:代码中 |
Beta Was this translation helpful? Give feedback.
-
|
let buffer = Buffer:: { |
Beta Was this translation helpful? Give feedback.
-
|
泛型详解中的列子,加上比较运算属性也无法编译通过呀?我按照错误提示修改了下 这样可以通过编译 |
Beta Was this translation helpful? Give feedback.
-
fn largest<T>(list: &[T]) -> T {
let mut largest = list[0];
for &item in list.iter() {
if item > largest {
largest = item;
}
}
largest
}为啥for循环时用 &item , if判断的时候用的 item , &item 是对 |
Beta Was this translation helpful? Give feedback.
-
|
提个小建议,如果正文中能直接加上某些专有名词对应的英文就更好了,比如这一章中的“多态”,以后看英文资料的时候就能直接对应上了。 |
Beta Was this translation helpful? Give feedback.
-
|
wishtody, 这语法看一遍都脑壳疼 |
Beta Was this translation helpful? Give feedback.
-
go: "please do not call me !" |
Beta Was this translation helpful? Give feedback.
-
|
我是看漏了哪章吗? |
Beta Was this translation helpful? Give feedback.
-
|
非常棒~🎉 |
Beta Was this translation helpful? Give feedback.
-
|
看教程不算难,但是一看习题1,直接懵了。和教程完全不搭,而且教程中关于单元结构体和元组结构体的描述一带而过,完全没想到这么多知识点。建议老师补充一下这一块。。。 |
Beta Was this translation helpful? Give feedback.
-
fn largest<T: PartialOrd<T> + Clone>(list: &[T]) -> T {
let mut largest = &list[0];
for item in list.iter() {
if item > largest {
largest = item;
}
}
(*largest).clone()
}
fn main() {
let number_list = vec![34, 50, 252, 100, 65];
let result = largest(&number_list);
println!("The largest number is {}", result);
let char_list = vec!['y', 'z', 'm', 'a', 'q'];
let result = largest(&char_list);
println!("The largest char is {}", result);
}
// cargo run
// The largest number is 252
// The largest char is z |
Beta Was this translation helpful? Give feedback.
-
复杂矩阵的运算为什么不能使用切片引用?切片引用不是也有数组长度的信息吗? |
Beta Was this translation helpful? Give feedback.
-
|
单态化是静态分发,机制类似于C++的模板;Rust也有动态分发的机制(使用dyn),使用虚函数表的机制 |
Beta Was this translation helpful? Give feedback.
-
Rust 中的 Const 泛型(Const Generics)Const 泛型允许你用编译期常量值作为泛型参数,不只是类型。这让你可以在类型系统中携带数值信息。 基本语法struct Array<T, const N: usize> {
data: [T; N],
}
let a: Array<i32, 5> = Array { data: [1, 2, 3, 4, 5] };
let b: Array<i32, 3> = Array { data: [1, 2, 3] };
// a 和 b 是不同的类型!
为什么需要它?在 const 泛型出现之前,Rust 标准库对数组 impl<T: PartialEq, const N: usize> PartialEq for [T; N] {
fn eq(&self, other: &Self) -> bool {
self.iter().zip(other).all(|(a, b)| a == b)
}
}实用例子1. 固定大小的矩阵 struct Matrix<const ROWS: usize, const COLS: usize> {
data: [[f64; COLS]; ROWS],
}
impl<const R: usize, const C: usize> Matrix<R, C> {
fn shape(&self) -> (usize, usize) {
(R, C)
}
}
// 编译器保证你不能把 3x4 的矩阵传给期望 4x3 的函数
fn transpose<const R: usize, const C: usize>(m: Matrix<R, C>) -> Matrix<C, R> { ... }2. 编译期边界检查 struct Buffer<const CAP: usize> {
data: [u8; CAP],
len: usize,
}
impl<const CAP: usize> Buffer<CAP> {
fn push(&mut self, byte: u8) {
assert!(self.len < CAP, "Buffer overflow");
self.data[self.len] = byte;
self.len += 1;
}
}3. 函数中使用 const 泛型 fn first_n<T, const N: usize>(slice: &[T]) -> &[T; N] {
slice[..N].try_into().unwrap()
}
let arr = [1, 2, 3, 4, 5];
let first: &[i32; 3] = first_n(&arr); // 返回类型携带了长度信息Const 泛型表达式(nightly)在稳定版中,const 泛型参数的使用有一些限制,不能直接写 #![feature(generic_const_exprs)]
fn concat<T: Copy, const A: usize, const B: usize>(
a: [T; A],
b: [T; B],
) -> [T; A + B] { // 编译期计算新长度
// ...
}限制(稳定版)
核心思想总结Const 泛型本质上是把编译期已知的数值提升到类型系统中,让编译器在零运行时开销的情况下做更多的正确性保证。这在嵌入式、线性代数库(如 |
Beta Was this translation helpful? Give feedback.

Uh oh!
There was an error while loading. Please reload this page.
-
basic/trait/generic
https://course.rs/basic/trait/generic.html
Beta Was this translation helpful? Give feedback.
All reactions