当前位置: 首页 > 知识库问答 >
问题:

当类型位于另一个模块内时,宏内的哪个符号允许类型构造?

盖嘉庆
2023-03-14

我写了一个非常简单的宏,它应该实现一个C结构的包装器:

macro_rules! features{
    ($struct_name: ident, $from_type: ident, $($name: ident => $vk: ident,)+) => {
        #[derive(Debug, Copy, Clone)]
        pub struct $struct_name{
            $(
                pub $name: bool,
            )+
        }
        impl $struct_name{
            pub fn empty() -> $struct_name{
                $struct_name{
                    $(
                        $name: false,
                    )+
                }
            }
            pub fn subset(&self, other: &Self) -> bool{
                $((!self.$name | other.$name))&&+
            }
        }

        //TODO: Probably just impl From with a cast?
        impl From<vk::$from_type> for $struct_name{
            fn from(features: vk::$from_type) -> $struct_name {
                $struct_name{
                    $(
                        $name: features.$vk != 0,
                    )+
                }
            }
        }

        impl From<$struct_name> for vk::$from_type {
            fn from(features: $struct_name) -> vk::$from_type {
                vk::$from_type{
                    $(
                        $vk: features.$name as u32,
                    )+
                }
            }
        }

        impl fmt::Display for $struct_name {
            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result{
                $(
                    if self.$name {
                        try!(writeln!(f, "{},", stringify!($name)));
                    }
                )+
                writeln!(f, "")
            }
        }
    }
}

我这样使用它:

features!{
    Features,
    PhysicalDeviceFeatures,
    robust_buffer_access => robustBufferAccess,
    full_draw_index_uint32 => fullDrawIndexUint32,
    image_cube_array => imageCubeArray,
    ....
}

这是可行的,但是我不得不做一个非常难看的hack$from_type:ident,然后在宏中使用vk::$from_type。我真正想做的是:

features!{
    Features,
    vk::PhysicalDeviceFeatures,
    robust_buffer_access => robustBufferAccess,
    full_draw_index_uint32 => fullDrawIndexUint32,
    image_cube_array => imageCubeArray,
    ....
}

然后,我可以完全提供类型,而不是依赖于ident在硬编码模块vk::中。

问题是我不能用pathty

$from_type{..}

错误:

error: expected expression, found `PhysicalDeviceFeatures`
  --> 
   |
38 |                 $from_type{
   |                 ^^^^^^^^^^

error: expected one of `.`, `;`, `?`, `}`, or an operator, found `{`
  --> /home/maik/projects/ashlib/ash/src/feature.rs:38:27
   |
38 |                 $from_type{
   | 

要使此功能正常工作,$from_type需要什么符号?

我创建了一个简短的例子来更清楚地表达我的问题(游乐场):

mod foo {
    struct Foo{
        i: i32
    }
}

macro_rules! c_enum {
    (
        $name:ty

    ) => {
        fn new() -> $name {
            $name{
                i: 42
            }
        }
    }
}
c_enum!{
    foo::Foo
}
fn main() {

}

共有1个答案

陶乐生
2023-03-14

我不知道为什么pathty失败,我会提交一个bug以防生锈。在过去,我通过使用tt说明符来解决这个问题,它几乎匹配所有内容。

 类似资料:
  • 我发现的大部分stackoverflow结果都是用于序列化整个对象或反序列化的。我的一些想法… 是否可以从三个值字段中删除@SerializedName并只序列化不为null的值? 我是否可以在java中构建某种可选的数据类型对象,该对象基于具有值的数据类型进行设置? 这个对象是一个更大的对象的一部分,而subitems对象有一个相当大的深度,它只是一个注释。我希望这是一个重复的问题,我只是找不到

  • 我试图设置请求的内容类型标题,但是okhttp会自动将内容类型添加到标题列表的末尾,并将其设置为application/json;charset=UTF-8,尽管我只是将其设置为application/json。 还有其他人经历过吗?如果是的话,我可以提出请求。 我发现okhttp没有通过fiddler正确发送此标头。

  • 问题内容: 我目前正在通过处理rosalind问题(基本上是一堆与生物信息学相关的代码katas)来学习Go 。 我目前用一种类型代表一条DNA链: 我最初的原因是封装字节片,所以我知道它只包含代表核苷酸的字节:。我意识到这显然没有被保证,因为我可以这样做: 并且不再保证我的dna链包含一个字节数组,其中只有这四个字节中的元素。 由于我的结构仅包含一个字节数组,因此这样做是更好/更理想的方法: 还

  • 当响应客户端的GET请求返回字节块时,要使用什么HTTP“内容类型”? 在本例中,信息负载是使用Python的Pickle库序列化的对象。

  • 我有一个组件,根据其大小接收道具。道具可以是字符串或数字,例如:或。 我能让知道这可以是PropTypes验证中的一个或另一个吗? 如果未指定类型,则会收到警告: prop type无效;它必须是一个函数,通常来自React。道具类型。

  • 内建类型 JavaScript 定义了七种内建类型: null undefined boolean number string object symbol — 在 ES6 中被加入的! 注意: 除了 object 所有这些类型都被称为“基本类型(primitives)”。 typeof 操作符可以检测给定值的类型,而且总是返回七种字符串值中的一种 — 令人吃惊的是,对于我们刚刚列出的七中内建类型,