Syntax 如何在关联类型中指定生存期?
我试图让每个Syntax 如何在关联类型中指定生存期?,syntax,rust,traits,lifetime,associated-types,Syntax,Rust,Traits,Lifetime,Associated Types,我试图让每个GraphicsContext实现返回着色器的不同实现 发布特性资源{ 类型着色器:着色器::着色器; } pub-GraphicsContext{ 类型资源:资源; ///创建着色器对象 fn创建_着色器结果; ///创建着色器程序对象 fn创建\u着色器\u程序结果; 或许: fn使用着色器(上下文:&GraphicsContext, 着色器:??**T::着色器**??) 其中T:GraphicsContext::Resources->Result; 像这样的事情可能吗?希
GraphicsContext
实现返回着色器的不同实现
发布特性资源{
类型着色器:着色器::着色器;
}
pub-GraphicsContext{
类型资源:资源;
///创建着色器对象
fn创建_着色器结果;
///创建着色器程序对象
fn创建\u着色器\u程序结果;
或许:
fn使用着色器(上下文:&GraphicsContext,
着色器:??**T::着色器**??)
其中T:GraphicsContext::Resources->Result;
像这样的事情可能吗?希望你能看到我有点理解基本的泛型(我来自Java),但这让我发疯(它确实感觉很粗糙)
如果这是正确的方法,那么我的实现就会出现问题。rustc
希望关联的类型具有指定的生存期
生存期参数数量错误:应为1,找到0[E0107]
opal_driver_gl/src/context.rs:23 type Shader=Shader;
我的OpenGLShader
struct实际上是类型OpenGLShader(&'a self,stage:core\u shader::stage,source:&str)
->结果{
//impl在这里
}
}
我尝试将生存期附加到OpenGLResources
和OpenGLGraphicsContext
,这解决了错误,但随后说error:parameter'a从未使用过
因此,其次,我问如何在我的关联类型中包含生命
非常感谢,如果你能看看这个。我觉得这样的东西在编译时一定可以检查,但我对Rust还很陌生,所以我不能很好地探索如何实现它。我最终切换到泛型,它提供了一个成功的实现
给定资源,请将问题一分为二。目前,它包含两个关系不大的问题,第一个问题可能不适合Stackoverflow。对于第二个问题,它需要关联的类型具有生存期参数:type Shader
。这一特征被称为更高级的类型,但在Rust中尚不可用。由于上述评论中的原因,我现在写这篇文章不是为了回答。@VladimirMatveev我曾考虑只问第一个问题,但后来我认为如果我的“抽象”想法有缺陷,第二个问题无关紧要,所以我将其包括在内。至于第二条评论,听起来好像我在试图实现不可能的目标。但是,我可以将OpenGLGraphicsContext
转换为OpenGLGraphicsContext
,然后编写type Shader=openglshaderies,我认为您可以,因为您的trait中的方法不使用'a
。您只需要小心处理OpenGLGraphicsContext
本身的生命周期,您可能需要使用。不过,一般来说,这是不可能做到的。
trait GraphicsContext<'a, R: Resources<'a>>
// replaced here
impl<'a> GraphicsContext<'a, OpenGLResources<'a>> for OpenGLGraphicsContext<'a> {
fn create_shader(&'a self, ty: Type, source: &str) -> Result<Shader<'a>, ShaderCreationError> {
// do something
}
}