Rust &()语法的用途是什么?
我一直在使用rust库编写一些Vulkan代码,遇到了以下代码片段: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
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函数使用。