&() 语法的目的是什么?
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(
...
&(),
)
我一直在使用 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(
...
&(),
)