basic/trait/trait-object #685
Replies: 157 comments 120 replies
-
特征对象要划重点,得多温习 |
Beta Was this translation helpful? Give feedback.
-
各位大佬们,怎么理解 Box动态分发,就像例子中:
这里x, y不是已知类型么,为什么不能像静态分发一样,为u8和f64分别生成一份代码 |
Beta Was this translation helpful? Give feedback.
-
fn add<T: Add<T, Output = T>>(a: T, b: T) -> T 这个 Output = T 没看懂啊 |
Beta Was this translation helpful? Give feedback.
-
最后好像没有直接给出一开始提出问题的解决方法, 是在练习里吗? |
Beta Was this translation helpful? Give feedback.
-
觉得 Box 智能指针能在本节做一个介绍,可能会更方便大家理解本节内容 |
Beta Was this translation helpful? Give feedback.
-
特征对象,有点像java的接口类型,例如Map,List。例如: List<String> list = new ArrayList<String>(); List是一个接口,ArrayList类型实现了List接口。 |
Beta Was this translation helpful? Give feedback.
-
眼睛看懂了,手还没懂。练习题都不够撸。 |
Beta Was this translation helpful? Give feedback.
-
我好像知道了什么,留下了贫穷的泪水 |
Beta Was this translation helpful? Give feedback.
-
看到这里,表示这是我学习 Rust 的第一个卡点。。 |
Beta Was this translation helpful? Give feedback.
-
特征对象可以模拟继承 |
Beta Was this translation helpful? Give feedback.
-
其实就是“多态”,在不同的语言里面有不同的名称、语法和实现方式,比如c语言就是用不安全的指针粗暴地实现,c++用虚函数来实现,java通过抽象类与接口来实现,像go,swift这种很新的语言都倾向于通过更灵活的鸭式辨型的抽象来实现多态和动态派发,go里面叫interface,swift里面叫protocol,而rust里面就叫trait |
Beta Was this translation helpful? Give feedback.
-
为自定义类型实现 + 操作 给struct Point加 :Add<T,Output =T > 和 不加 有什么区别呢? 请大佬讲解下 |
Beta Was this translation helpful? Give feedback.
-
用下标处理,就不需要 fn largest<T: PartialOrd>(list: &[T]) -> &T {
let mut largest_idx = 0_usize;
for i in 0..list.len() {
if list[i] > list[largest_idx] {
largest_idx = i;
}
}
&list[largest_idx]
} |
Beta Was this translation helpful? Give feedback.
-
感觉可以跟面向对象中的的继承和多态来理解。 impl Trait for 类型,就是子类继承父类。 默认实现:就是如果子类没有对父类的方法进行重构时,就会继承父类中定义的方法,此时如果用子类调用该方法,则 会 调用父类的方法。 特征约束:就是定义函数的时候,形参的类型是一个父类。则调用该函数的时候,必须传一个继承该父类的子类的实参。 多重特征约束:就是多重继承(好像是这么叫法吧,忘了),<T:父类1+父类2>,就是说实参必须是同时继承父类1和父类2的一个子类。 不知道对不对,大佬请指正😃 |
Beta Was this translation helpful? Give feedback.
-
fn largest<T: PartialOrd>(list: &[T]) -> &T { for i in 0..list.len() { largest |
Beta Was this translation helpful? Give feedback.
-
impl<T: Display> ToString for T { 这个很费解,这段代码是官方库里的,但是能影响任何用户自定义的T。 那这些方法是怎么实现的呢? |
Beta Was this translation helpful? Give feedback.
-
对于有C++基础的同学, 我觉得可以这样解释 rust对trait能同时实现静态和动态分发, 但C++实际上是对concept实现静态分发, 对虚函数/纯虚函数实现动态分发 |
Beta Was this translation helpful? Give feedback.
-
关于Rust在设计特例化impl的动机不是很明白: 具体可参照Error code E0119 比如定义一个统一的trait K,那么: impl<T: trait bound1> K for T 会报错为confilcting impl... 即使trait bound1 和 trait bound2 是disjoint的 不知道Rust将来是否能支持如同cpp一样 按照trait继承关系给出安全特例化的impl用法 |
Beta Was this translation helpful? Give feedback.
-
看起来rust的特征比go的interface麻烦挺多。 |
Beta Was this translation helpful? Give feedback.
-
largest 不指定 Copy 特征 的实现,不知道对不对
|
Beta Was this translation helpful? Give feedback.
-
对于综合示例二中的 match *self |
Beta Was this translation helpful? Give feedback.
-
”(使用特征对象时)不能调用类型 Button 本身实现的方法和类型 Button 实现于其他特征的方法“ 这一段看不懂,gpt 说是使用特征对象时有类型擦除。 ” |
Beta Was this translation helpful? Give feedback.
-
有个小问题,为啥特征对象有两个使用方法: &dyn 和 Box,而且函数签名里这俩不同要输入的参数也不同。 |
Beta Was this translation helpful? Give feedback.
-
pub fn notify(item: &impl Summary) {
println!("Breaking news! {}", item.summarize());
}
pub fn notify(item: Summary) {
println!("Breaking news! {}", item.summarize());
} |
Beta Was this translation helpful? Give feedback.
-
哎,太难了,先看后面的,回头再来啃 |
Beta Was this translation helpful? Give feedback.
-
fn largest<T: std::cmp::PartialOrd>(list: &[T]) -> &T {
} |
Beta Was this translation helpful? Give feedback.
-
basic/trait/trait-object
https://course.rs/basic/trait/trait-object.html
Beta Was this translation helpful? Give feedback.
All reactions