< 返回版块

sunnyregion 发表于 2021-06-21 12:08

我使用struct作为继承的方式,我想获得当前struct的名字,当然最好也可以获得父struct的名字最好

评论区

写评论
作者 sunnyregion 2021-06-22 18:02

谢谢

--
👇
苦瓜小仔: http://129.28.186.100/tlborm/macros/minutiae/scoping.html

http://129.28.186.100/tlborm/macros/minutiae/import-export.html

--
👇
sunnyregion: 顺便问一下,这个宏怎么能够全局使用?

--
👇
sunnyregion: Thx a lot.

--
👇
苦瓜小仔: 只有宏能做到获取 identifier 的名称。

使用声明宏:

macro_rules! struct_names {
    (struct $name:ident { $($fname:ident : $ftype:ty),* }) => {
        #[allow(dead_code)]
        struct $name {
            $($fname : $ftype),*
        }

        impl $name {
            const fn field_names() -> &'static[&'static str] {
                &[$(stringify!($fname)),*]
            }

            const fn struct_name() -> &'static str{
                stringify!($name)
            }
        }
    }
}

struct_names! {
struct Export {
    first_name: String,
    last_name: String,
    gender: String,
    date_of_birth: String,
    address: String
}
}

fn main() {
    println!("{}\n{:?} ", Export::struct_name(), Export::field_names(),);
    // Export
    // ["first_name", "last_name", "gender", "date_of_birth", "address"]
}

参考:https://stackoverflow.com/questions/37140768/how-to-get-struct-field-names-in-rust

过程宏应该也可以获得名称。

的确, Rust 没有继承的概念。

苦瓜小仔 2021-06-21 16:55

http://129.28.186.100/tlborm/macros/minutiae/scoping.html

http://129.28.186.100/tlborm/macros/minutiae/import-export.html

--
👇
sunnyregion: 顺便问一下,这个宏怎么能够全局使用?

--
👇
sunnyregion: Thx a lot.

--
👇
苦瓜小仔: 只有宏能做到获取 identifier 的名称。

使用声明宏:

macro_rules! struct_names {
    (struct $name:ident { $($fname:ident : $ftype:ty),* }) => {
        #[allow(dead_code)]
        struct $name {
            $($fname : $ftype),*
        }

        impl $name {
            const fn field_names() -> &'static[&'static str] {
                &[$(stringify!($fname)),*]
            }

            const fn struct_name() -> &'static str{
                stringify!($name)
            }
        }
    }
}

struct_names! {
struct Export {
    first_name: String,
    last_name: String,
    gender: String,
    date_of_birth: String,
    address: String
}
}

fn main() {
    println!("{}\n{:?} ", Export::struct_name(), Export::field_names(),);
    // Export
    // ["first_name", "last_name", "gender", "date_of_birth", "address"]
}

参考:https://stackoverflow.com/questions/37140768/how-to-get-struct-field-names-in-rust

过程宏应该也可以获得名称。

的确, Rust 没有继承的概念。

作者 sunnyregion 2021-06-21 16:17

顺便问一下,这个宏怎么能够全局使用?

--
👇
sunnyregion: Thx a lot.

--
👇
苦瓜小仔: 只有宏能做到获取 identifier 的名称。

使用声明宏:

macro_rules! struct_names {
    (struct $name:ident { $($fname:ident : $ftype:ty),* }) => {
        #[allow(dead_code)]
        struct $name {
            $($fname : $ftype),*
        }

        impl $name {
            const fn field_names() -> &'static[&'static str] {
                &[$(stringify!($fname)),*]
            }

            const fn struct_name() -> &'static str{
                stringify!($name)
            }
        }
    }
}

struct_names! {
struct Export {
    first_name: String,
    last_name: String,
    gender: String,
    date_of_birth: String,
    address: String
}
}

fn main() {
    println!("{}\n{:?} ", Export::struct_name(), Export::field_names(),);
    // Export
    // ["first_name", "last_name", "gender", "date_of_birth", "address"]
}

参考:https://stackoverflow.com/questions/37140768/how-to-get-struct-field-names-in-rust

过程宏应该也可以获得名称。

的确, Rust 没有继承的概念。

作者 sunnyregion 2021-06-21 16:06

Thx a lot.

--
👇
苦瓜小仔: 只有宏能做到获取 identifier 的名称。

使用声明宏:

macro_rules! struct_names {
    (struct $name:ident { $($fname:ident : $ftype:ty),* }) => {
        #[allow(dead_code)]
        struct $name {
            $($fname : $ftype),*
        }

        impl $name {
            const fn field_names() -> &'static[&'static str] {
                &[$(stringify!($fname)),*]
            }

            const fn struct_name() -> &'static str{
                stringify!($name)
            }
        }
    }
}

struct_names! {
struct Export {
    first_name: String,
    last_name: String,
    gender: String,
    date_of_birth: String,
    address: String
}
}

fn main() {
    println!("{}\n{:?} ", Export::struct_name(), Export::field_names(),);
    // Export
    // ["first_name", "last_name", "gender", "date_of_birth", "address"]
}

参考:https://stackoverflow.com/questions/37140768/how-to-get-struct-field-names-in-rust

过程宏应该也可以获得名称。

的确, Rust 没有继承的概念。

苦瓜小仔 2021-06-21 13:35

只有宏能做到获取 identifier 的名称。

使用声明宏:

macro_rules! struct_names {
    (struct $name:ident { $($fname:ident : $ftype:ty),* }) => {
        #[allow(dead_code)]
        struct $name {
            $($fname : $ftype),*
        }

        impl $name {
            const fn field_names() -> &'static[&'static str] {
                &[$(stringify!($fname)),*]
            }

            const fn struct_name() -> &'static str{
                stringify!($name)
            }
        }
    }
}

struct_names! {
struct Export {
    first_name: String,
    last_name: String,
    gender: String,
    date_of_birth: String,
    address: String
}
}

fn main() {
    println!("{}\n{:?} ", Export::struct_name(), Export::field_names(),);
    // Export
    // ["first_name", "last_name", "gender", "date_of_birth", "address"]
}

参考:https://stackoverflow.com/questions/37140768/how-to-get-struct-field-names-in-rust

过程宏应该也可以获得名称。

的确, Rust 没有继承的概念。

ruby 2021-06-21 13:31

Rust没有字段继承的概念,社区常用做法都是通过扩展实现类似效果

就像ruby_on_rails给String extend了一堆方法,你可以参考下FutureExt

用 Ext 或者 结构体包起来能解决绝大部分抽象了,没有必要非要用继承

1 共 6 条评论, 1 页