簡體   English   中英

我如何使用 @ 字符作為 Rust 裝飾器來實現結構的特征?

[英]how could i use @ character as a Rust decorator to implement trait to a struct?

如果可能的話,我如何使用帶有 @ 字符的裝飾器來獲得 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

如果可能的話,我如何使用帶有 @ 字符的裝飾器來獲得 python 風格的味道,同時在我的結構上實現特征?

Rust 不是 Python,Rust 不使用@字符或運行時裝飾。 然而,正如 zgerd 指出的那樣,您可以定義自定義派生,它可以讓您編寫類似的東西

#[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 {}

最多,對於這樣一個簡單的特征,你會編寫一個基本的聲明性宏

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

這就是大多數標准庫為減少樣板文件所做的事情,盡管我什至不會打擾,除非您需要在六種左右的良好類型上實現這種自相似的實現。

另請注意,您的Animal特征定義不正確,只需嘗試編譯它就會告訴您(即使沒有實現它):字段不是特征中的有效概念。

此外,這看起來像是某種偽 OO 層次結構的東西,這可能是個壞主意。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM