Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
И не мне, и не вам судить, что будет через н лет, мы не провидцы.
А если его никак не продвигать, то прогресса не будет, не будет ничего лучшего на замену плюсам.
Здравствуй дорогой дедушка!
Пишу тебе из далёкого 2025 года.
Нет, Rust не стал умирать от роста фич языка и не похож этим на C++.
Но Rust так и не стал пока популярным. Желанным, но не популярным.
Молодой, вечно подающий надежды.
Подождём ещё 10 лет?
trait DoIt {
fn do_it(&self);
}
fn do_it_statically<T: DoIt>(x: T) { // static dispatch
// ...
}
fn do_it_dynamically(x: &DoIt) { // dynamic dispatch
// ...
}
use modb::A as A1, но тогда всё равно нельзя будет использоватьerror: multiple applicable methods in scope).В расте тип &ClickCallback или Box<ClickCallback> называется «объект-типаж» и включает в себя указатель на экземпляр типа T, который реализует заданный типаж (ClickCallback), и указатель на таблицу виртуальных методов.Specialization. Specialization allows there to be multiple
implementations of a given trait for a given set of types.
&self и есть такая ссылка.&self, либо нет таблицы, есть статический вызов метода, но в него всё равно передаётся та же самая ссылка на экземпляр типа &self. Всё происходит прозрачно.&self будет ссылка на конкретный экземпляр типа, на котором вызывается метод.Vec<Box<ClickCallback>> динамически.Vec<&MyType>(10) будет занимать, скажем, какой-то заголовок + 40 байт (если ссылка 4-байтовая), а Vec<&ClickCallback>(10) — заголовок + 80 байт, если ссылка на таблицу виртуальных методов тоже 4-байтовая. Правильно?class Base {};
class Der1:public Base{};
class Der2:public Base{};
void print(Der1* d1) {cout<<"Der1";}
void print(Der2* d2) {cout<<"Der2";}
void main() {
vector<Base*> vec;
vec.push_back(new Der1);
vec.push_back(new Der2);
for(Base* el:vec) {
print(el);
}
}
fn foo(a: u32) {
...
}
fn foo(a: &str) {
...
}
trait Foo {
fn bar(&self);
}
impl Foo for u32 {
fn bar(&self) {
println!("{:?}", self);
}
}
impl<'r> Foo for &'r str {
fn bar(&self) {
println!("{:?}", self);
}
}
fn main() {
let first = 10;
let second = "str";
let vec : Vec<&Foo> = vec![&first, &second];
for elem in vec {
elem.bar();
}
}
Foo::bar(elem)
trait Base {
fn print(&self);
}
struct Der1;
struct Der2;
impl Base for Der1 {
fn print(&self) {
println!("Der1")
}
}
impl Base for Der2 {
fn print(&self) {
println!("Der2")
}
}
fn main() {
let d1 = Der1;
let d2 = Der2;
let v: Vec<&Base> = vec![&d1, &d2];
for e in v {
e.print()
}
}
Абстракции без накладных расходов: типажи в Rust