You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
structPoint<T>{x:T,y:T,}fnmain(){let p = Point{x:5,y:"hello".to_string()};}//这串代码是不正确的//原因如下:在结构体中,同一泛型字段只能储存相同类型的值,此处x,y均是泛型T,则在赋值时因赋上相同类型的值//修改方式可为:structPoint<T,U>{x:T,y:U,}fnmain(){let p = Point{x:5,y:"hello".to_string()};}
structPoint<T>{x:T,y:T,}impl<T>Point<T>{fnx(&self) -> &T{&self.x}}//使用泛型参数前,依然需要提前声明:impl<T>,只有提前声明了,我们才能在Point<T>中使用它,这样 Rust 就知道 Point 的尖括号中的类型是泛型而不是具体类型。需要注意的是,这里的 Point<T> 不再是泛型声明,而是一个完整的结构体类型,因为我们定义的结构体就是 Point<T> 而不再是 Point。fnmain(){let p = Point{x:5,y:10};println!("p.x = {}", p.x());}
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
-
方法 Method
在 Rust 中,使用
.调用的情况是针对一个具体的实例,用来调用该实例的方法或访问其字段。例如,如果有一个结构体实例my_struct,可以使用my_struct.method()或my_struct.field来调用实例的方法或访问其字段。而使用
::调用的情况则通常是用来从一个类型或模块中访问关联函数、常量或嵌套类型。比如,可以使用String::from("hello")来调用String类型的关联函数from,或者使用std::cmp::min(3, 5)来调用std::cmp模块中的min函数。总结起来,在 Rust 中使用
.调用是针对实例的方法和字段,而使用::调用则是针对类型、模块及其关联函数、常量和嵌套类型的访问。泛型和特征
泛型Generics
当使用
#[derive(Debug)]注解为自定义的结构体或枚举类型派生Debugtrait 时,编译器会自动为该类型生成实现了std::fmt::Debug的代码,因此就不需要手动实现Debugtrait 或者通过impl Debug for YourType的方式来限定。在 Rust 中,数组是一个固定大小的数据结构,它要求所有元素都具有相同的类型。这是因为在编译时,编译器需要知道每个元素在内存中所占的空间大小,以便正确地分配和访问数组的元素。
关于打印的重要知识
关于
{}{:?}{:#?}的使用场景{}:是最常用的占位符,用于输出实现了std::fmt::Displaytrait 的类型,大多数内建类型(比如整型,浮点型,字符串等)都实现了Displaytrait ,因此可以直接使用{}进行格式化输出;{:?}:这个占位符用于实现了std::fmt::Debugtrait 的类型,它会以调试格式打印类型的值,通常用于调试目的,如果你想查看更多关于类型的信息,包括类型名称和字段名,可以使用{:?};{:#?}:这个占位符也用于输出实现了std::fmt::Debugtrait 的类型,但会以更美观的形式打印出来,每个字段占一行,适合复杂类型的调试输出。例子如下:
常见的实现
std::fmt::Debugtrait 的方式派生宏:对于简单的结构体和枚举,你可以通过
#[derive(Debug)]注解来自动实现Debugtrait。这样编译器会自动生成默认的调试输出格式。示例代码如下:手动实现:对于更复杂的类型,你可能需要手动实现
Debugtrait 来定义自定义的调试输出格式。你可以在类型的impl块中实现Debugtrait 的fmt方法。示例代码如下:当手动实现
std::fmt::Debugtrait 时,我们需要在类型的impl块中定义fmt方法,该方法接收一个&mut fmt::Formatter参数,并返回fmt::Result,下面是对例子的详细解释:首先,我们定义了一个结构体
MyStruct,其中包含两个字段:field1(类型为i32)和field2(类型为String)。接着,在
impl块中,我们为MyStruct实现了Debugtrait。在fmt方法中,我们使用write!宏将格式化后的字符串写入到提供的Formatter中。在这个例子中,我们使用了
{:?}占位符来表示调试格式。当我们在代码中使用println!("{:?}", my_struct)时,Rust 会自动调用fmt方法并将MyStruct的字段值填充到格式化字符串中,最终打印出类似"MyStruct { field1: 42, field2: \"Hello\" }"的调试信息。在下方这个例子里,并没有对任何类型实现
std::fmt::Debugtrait原因是
T: std::fmt::Debug只是对T进行注解,泛型T必须是一个实现了std::fmt::Debugtrait 的类型,这样在函数中我们就可以放心地使用{:?}占位符来打印类型T的调试信息,因为编译器已经保证了类型T是可以被格式化打印的。Beta Was this translation helpful? Give feedback.
All reactions