Rust &()语法的用途是什么?

Rust &()语法的用途是什么?,rust,syntax,Rust,Syntax,我一直在使用rust库编写一些Vulkan代码,遇到了以下代码片段: let compute_pipeline = Arc::new(ComputePipeline::new( device.clone(), &shader.main_entry_point(), &(), )); 我在这里特别询问第三个参数——在ComputePipeline::new的实现中,它被列为: /// Builds a new `ComputePipeline`. pub

我一直在使用rust库编写一些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,
{
    ...
}
这里的语法是什么?对单元类型的引用

[是否]是对单元类型的引用

这就是事实。它只是传递一个引用&对值的引用

类似语法:

&1:对文字1的引用。 &[]:对空切片的引用。 [是否]是对单元类型的引用

这就是事实。它只是传递一个引用&对值的引用

类似语法:

&1:对文字1的引用。 &[]:对空切片的引用。
是的,这是一个单位的参考。 这里需要这样做,因为它是通用的:

pub fn new<Cs>(
    device: Arc<Device>,
    shader: &Cs,
    specialization: &Cs::SpecializationConstants
) -> Result<ComputePipeline<PipelineLayout<Cs::PipelineLayout>>, ComputePipelineCreationError> where
    Cs::PipelineLayout: Clone,
    Cs: EntryPointAbstract, 
专门化类型是与着色器类型相关联的类型。为着色器提供的值的类型将决定专门化的类型,具体取决于其EntryPointAbstract的实现

在您提供的示例代码中,尚不清楚shader.main\u entry\u point的类型,但它必须具有EntryPointAbstract的实现,并且其关联的SpecializationConstants类型为

为了使类型检查能够工作,您必须通过&forspecialization,即使它很可能不表示任何值。编译器可以对此进行优化,因此在运行时,该值不存在,并且函数实际上只有两个参数


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

是的,它是对单元的引用。 这里需要这样做,因为它是通用的:

pub fn new<Cs>(
    device: Arc<Device>,
    shader: &Cs,
    specialization: &Cs::SpecializationConstants
) -> Result<ComputePipeline<PipelineLayout<Cs::PipelineLayout>>, ComputePipelineCreationError> where
    Cs::PipelineLayout: Clone,
    Cs: EntryPointAbstract, 
专门化类型是与着色器类型相关联的类型。为着色器提供的值的类型将决定专门化的类型,具体取决于其EntryPointAbstract的实现

在您提供的示例代码中,尚不清楚shader.main\u entry\u point的类型,但它必须具有EntryPointAbstract的实现,并且其关联的SpecializationConstants类型为

为了使类型检查能够工作,您必须通过&forspecialization,即使它很可能不表示任何值。编译器可以对此进行优化,因此在运行时,该值不存在,并且函数实际上只有两个参数

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

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

新店 装置:Arc, 着色器:&Cs, 专门化:&Cs::专门化常量 在这种情况下,关联的类型是零元组,或者:

类型SpecializationConstants= 传递对值的引用意味着添加一个&,因此对单位类型的引用如下&:

ComputePipeline::新建 ... &, Vulkano的ComputePipeline::new将对关联类型SpecializationConstants的引用作为其第三个参数:

新店 装置:Arc, 着色器:&Cs, 专门化:&Cs::专门化常量 在这种情况下,关联的类型是零元组,或者:

类型SpecializationConstants= 传递对值的引用意味着添加一个&,因此对单位类型的引用如下&:

ComputePipeline::新建 ... &,
对单元类型的引用?-这正是Hanks@kmdreko所说的,听起来可能像是一个反问句,但我不确定,我发现用Rust来确保你真正理解发生了什么是值得的。参考单位类型这正是Hanks@kmdreko所说的,听起来可能像是一个反问句,但我不确定,我发现要确保你真正理解所发生的事情是值得的。谢谢你的解释!因此,澄清一下-在这里传递对单元类型的引用在运行时仍然不表示任何内容,这是编译时进行兼容性/类型检查的结果?@NicBarker,根据上下文,单元并非完全不表示任何内容,这通常是Option::None或!但是,由于它总是相同的值,因此它不携带任何信息,因此在没有信息可发送或返回的情况下,通常会使用它。例如,在C或Java具有void伪返回类型的情况下,会使用rust函数。感谢您的解释!因此,澄清一下-在这里传递对单元类型的引用在运行时仍然不表示任何内容,这是编译时进行兼容性/类型检查的结果?@NicBarker,根据上下文,单元并非完全不表示任何内容,这通常是Option::None或!但由于它总是相同的值,因此它不携带任何信息,因此在没有信息可发送或返回的情况下,通常使用它。例如,在C或Java具有void伪返回类型的情况下,rust函数使用。