как я могу использовать символ @ в качестве декоратора Rust для реализации трейта в структуре? - PullRequest
0 голосов
/ 07 мая 2020

Как я могу использовать декоратор с, если возможно, символом @, чтобы иметь вкус стиля python при реализации трейтов в моих структурах?

trait Animal {
    fn get_name(&self) -> &str {
        &self.name
    }
}

trait Felidae {
    fn to_claw(&self) -> &str;{
        println!("i can scratch off !");
    }
}


struct Dog {
    name: String,
}

struct Cat {
    name: String,
}

@Animal
Dog

@Animal,Felidae
Cat

1 Ответ

2 голосов
/ 07 мая 2020

Как я могу использовать декоратор с, если возможно, символом @, чтобы иметь вкус стиля python при реализации трейтов в моих структурах?

Rust не Python, Rust не используйте символ @ или украшение среды выполнения. Однако, как указывает zgerd, вы можете определить custom derives , что позволит вам написать что-то вроде

#[derive(Animal)]
struct Dog {...}

Я очень сомневаюсь в его ценности в этом случае поскольку реализации не совсем обременительны:

trait Animal {
    fn get_name(&self) -> &str;
}
trait Felidae {
    fn to_claw(&self) {
        println!("i can scratch off !");
    }
}

struct Dog {
    name: String,
}
impl Animal for Dog {
    fn get_name(&self) -> &str { &self.name }
}

struct Cat {
    name: String,
}
impl Animal for Cat {
    fn get_name(&self) -> &str { &self.name }
}
impl Felidae for Cat {}

Максимум , для такой простой черты вы должны написать базовый c декларативный макрос :

macro_rules! animal_impl {
    ($t: ty) => {
        impl Animal for $t {
            fn get_name(&self) -> &str { &self.name }
        }
    }
}
animal_impl!{Dog}
animal_impl!{Cat}

Это то, что делает большая часть стандартной библиотеки, чтобы уменьшить шаблон , хотя я бы даже не стал беспокоиться, если вам не нужна такая самоподобная реализация для добрых полдюжины типов или около того .

Также обратите внимание, что ваше определение признака Animal неверно, и простая попытка его компиляции сказала бы вам (даже без его реализации): поля не являются допустимым понятием в чертах.

Также это похоже на какую-то псевдо-объектно-ориентированную иерархию, что, вероятно, плохая идея.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...