gpt4 book ai didi

syntax - 如何指定关联类型的生命周期?

转载 作者:行者123 更新时间:2023-11-29 08:01:22 25 4
gpt4 key购买 nike

我正在尝试获取每个 GraphicsContext实现返回 Shader 的不同实现.

pub trait Resources {
type Shader: shader::Shader;
}

pub trait GraphicsContext {

type Resources: Resources;

/// Creates a shader object
fn create_shader<'a>(&'a self, shader::Stage, source: &str)
-> Result<<<Self as GraphicsContext>::Resources as Resources>::Shader,
shader::CreateError>;

/// Creates a shader program object
fn create_shader_program<'a>(&'a self, shaders: Vec<&shader::Shader>)
-> Result<Box<shader::ShaderProgram + 'a>, shader::ProgramCreateError>;

// more to come

}

这是为了 create_shader_program方法(和其他方法)知道 Shader 的具体类型这样他们就可以在着色器对象上调用特定于实现的方法。

我不想将这些方法(例如 setCurrentattach )放入所有实现都必须使用的特征中。并非所有图形 API 使用相同的系统:OpenGL 是绑定(bind)/解除绑定(bind),Vulkan 将是结构/设置字段,DirectX 是其他东西等等。

首先,我要问的是,这是构造我的引擎的正确方法吗。我相信在我的框架/应用程序级代码中需要这些 Shader对象,我可以根据 Context 的当前类型指定具体类型.

// almost certain this doesn't compile, but should be possible in theory
// I'm trying to say:
// the type of the `shader` argument must match to the associated type
// contained within the `context`
fn do_something_with_shader(context: &GraphicsContext,
shader: ??**GraphicsContext::Resources::Shader**??)
-> Result<Foo, Bar>;

或者也许:

fn do_something_with_shader<T>(context: &GraphicsContext<T>,
shader: ??**T::Shader**??)
where T: GraphicsContext::Resources -> Result<Foo, Bar>;

这样的事情可能吗?希望你能看到我有点理解基本的泛型(我来自 Java),但这让我发疯(它确实感觉非常 hackish)。

如果这是正确的方法,那么我的实现就会出现问题。 rustc希望关联类型具有指定的生命周期。

wrong number of lifetime parameters: expected 1, found 0 [E0107]
opal_driver_gl/src/context.rs:23 type Shader = Shader;

我的 OpenGLShader struct 实际上是 OpenGLShader<'a> 类型,所以这个错误是有道理的。我的问题是在这一堆代码中我从哪里得到生命周期:

struct OpenGLResources;

impl Resources for OpenGLResources {
type Shader = OpenGLShader;
}

impl GraphicsContext for OpenGLGraphicsContext {

type Resources = Resources;

/// Creates a shader object
fn create_shader<'a>(&'a self, stage: core_shader::Stage, source: &str)
-> Result<<<Self as GraphicsContext>::Resources as Resources>::Shader,
core_shader::CreateError> {
// impl goes here
}

}

我尝试将一生附加到 OpenGLResourcesOpenGLGraphicsContext ,它解决了错误但随后说 error: parameter 'a is never used .

因此,其次,我问如何将生命周期包含在关联类型中

如果你能看看这个,非常感谢。我觉得像这样的东西必须可以在编译时检查,但我对 Rust 很陌生,所以我不太明白如何实现它。

最佳答案

我最终改用了泛型,它提供了一个成功的实现。

鉴于 Resources<'a> , 我可以定义 GraphicsContext像这样:

trait GraphicsContext<'a, R: Resources<'a>>

2 'a Shader<'a> 需要以上生命周期和 ShaderProgram<'a>内部结构 Resources

然后就可以提供OpenGL的实现了。注意 Resources已更改为 OpenGLResources .

                             // 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
}

}

关于syntax - 如何指定关联类型的生命周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30932622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com