< 返回版块

asuper 发表于 2024-11-07 10:23

#[cfg(feature = "serde")]
// 下面的3行都会被上面这一行控制,而不是按照我希望的,两个cfg分别控制一行
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
#[cfg(not(feature = "serde"))]
#[derive(Debug, Default, Clone)]
pub struct VecHash<K, V> {
    inner: HashMap<K, Vec<V>>,
}

// 这里希望通过clone_able特性来控制 V 是否需要实现 Clone,但是这个写法不正确
cfg_if::cfg_if!{
    if #[cfg(feature = "clone_able")] {
        impl<K, V> VecHash<K, V>
        where
            K: Hash+Eq,
            V: PartialEq + Clone
    } else {
        impl<K, V> VecHash<K, V>
        where
            K: Hash+Eq,
            V: PartialEq,
    }
}
{
}

比如以上代码,希望通过feature=serde来控制结构体是否可以被序列化,通过feature=clone_able来控制Hash的Value是否是可以Clone的

评论区

写评论
作者 asuper 2024-11-12 21:17

啊,我突然想通了,的确是可以拆开写的,在clone_able的impl里面单独写出需要Clone特性的代码就行了

--
👇
LazyBoy: 因为宏的输出本身也是一个{}块,所以你写的impl实现体{}不能写在宏外面。

cfg_if宏其实也只是帮我们拼了一下#[cfg]属性宏的条件,最简单的就是拆开来写,逻辑上最清晰(cfg_if展开也是类似的结果),因为这里的条件足够简单,就可以不需要cfg_if,条件复杂的话用cfg_id也是要把一个完整的impl全写到宏内部才行:

#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Debug, Default, Clone)]
pub struct VecHash<K, V> {
    inner: HashMap<K, Vec<V>>,
}

#[cfg(feature = "clone_able")]
impl<K, V> VecHash<K, V>
where
    K: Hash+Eq,
    V: PartialEq + Clone
{
}

#[cfg(not(feature = "clone_able"))]
impl<K, V> VecHash<K, V>
where
    K: Hash+Eq,
    V: PartialEq
{
}

--
👇
asuper: 有没有大佬指点一下,下面cfg_if这里怎么写才能通过

LazyQc 2024-11-12 14:15

因为宏的输出本身也是一个{}块,所以你写的impl实现体{}不能写在宏外面。

cfg_if宏其实也只是帮我们拼了一下#[cfg]属性宏的条件,最简单的就是拆开来写,逻辑上最清晰(cfg_if展开也是类似的结果),因为这里的条件足够简单,就可以不需要cfg_if,条件复杂的话用cfg_id也是要把一个完整的impl全写到宏内部才行:

#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Debug, Default, Clone)]
pub struct VecHash<K, V> {
    inner: HashMap<K, Vec<V>>,
}

#[cfg(feature = "clone_able")]
impl<K, V> VecHash<K, V>
where
    K: Hash+Eq,
    V: PartialEq + Clone
{
}

#[cfg(not(feature = "clone_able"))]
impl<K, V> VecHash<K, V>
where
    K: Hash+Eq,
    V: PartialEq
{
}

--
👇
asuper: 有没有大佬指点一下,下面cfg_if这里怎么写才能通过

作者 asuper 2024-11-12 09:19

有没有大佬指点一下,下面cfg_if这里怎么写才能通过

作者 asuper 2024-11-07 12:03

这个的确可以用,谢谢

通过feature=clone_able来控制Hash的Value是否是可以Clone的

这个问题呢

--
👇
lxl66566: #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]

lxl66566 2024-11-07 10:30

#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]

1 共 5 条评论, 1 页