&() 语法的目的是什么?

What is the purpose of the &() syntax?

我一直在使用 Rust 库 Vulkano 编写一些 Vulkan 代码,并遇到了以下代码片段:

let compute_pipeline = Arc::new(ComputePipeline::new(
    device.clone(),
    &shader.main_entry_point(),
    &(),
));

我在这里特别询问第三个参数 - 在 ComputePipeline::new 的实现中它被列为:

/// Builds a new `ComputePipeline`.
pub fn new<Cs>(
    device: Arc<Device>,
    shader: &Cs,
    specialization: &Cs::SpecializationConstants,
) -> Result<ComputePipeline<PipelineLayout<Cs::PipelineLayout>>, ComputePipelineCreationError>
where
    Cs::PipelineLayout: Clone,
    Cs: EntryPointAbstract,
{
    ...
}

这里的 &() 语法是什么?对单位类型的引用?

[Is it] a reference to the unit type?

就是这样。它只是将引用 & 传递给值 ().

类似语法:

  • &1:对文字 1.
  • 的引用
  • &[]: 对空切片的引用。

是的,它是对单位的引用。 这是这里需要的,因为 ComputePipeline::new 是通用的:

pub fn new<Cs>(
    device: Arc<Device>,
    shader: &Cs,
    specialization: &Cs::SpecializationConstants
) -> Result<ComputePipeline<PipelineLayout<Cs::PipelineLayout>>, ComputePipelineCreationError> where
    Cs::PipelineLayout: Clone,
    Cs: EntryPointAbstract, 

specialization的类型是与shader的类型相关的关联类型。为 shader 提供的值类型将决定 specialization 的类型,具体取决于其对 EntryPointAbstract.

的实现

在您提供的示例代码中,不清楚 shader.main_entry_point() 的类型是什么,但它必须具有 EntryPointAbstract 的实现,并且其关联的 SpecializationConstants 类型是 ().

为了进行类型检查,您必须为 specialization 传递 &(),即使它很可能表示“无值”。编译器可以优化它,所以在运行时,这个值不存在,函数实际上只有两个参数。

据推测,EntryPointAbstract 的其他实现对于 SpecializationConstants 具有更有趣的类型。

Vulkano 的 ComputePipeline::new 引用关联类型 SpecializationConstants 作为其第三个参数:

pub fn new<Cs>(
    device: Arc<Device>,
    shader: &Cs,
    specialization: &Cs::SpecializationConstants
)

在这种情况下,关联类型是零元组,或 the unit type:

type SpecializationConstants = ()

传递对值的引用意味着添加一个 &,因此对单位类型的引用看起来像这样 &() :

ComputePipeline::new(
  ...
  &(),
)