当前位置: 首页 > 知识库问答 >
问题:

带类属参数的锈病性状动态调度

佴阳辉
2023-03-14

我有以下Rust游乐场永久墨水

如果我从这样的问题中理解正确的话,那么由于泛型是单态的,Rust运行时就不可能泄漏出material的适当方法,假设每个实现normal的类型表面上可能有一个不同的方法?这对我来说并不是很好,因为在与Rust运行时相同的位置上,我似乎可以查看我手头上的normal实现器,比如sphere和我将查看sphere的vtable。你能解释一下我错在哪里吗?

从那里,我尝试简单地与编译器战斗,并进入静态分派。第17-21行

struct Hit<'a> {
    point: Vec3,
    distance: f32,
    object: &'a dyn Normal,
}

变成了

struct Hit<'a, T: Normal> {
    point: Vec3,
    distance: f32,
    object: &'a T,
}

共有1个答案

金慈
2023-03-14

我可能错过了什么,但我认为你可以--至少从我所看到的--沿着你的道路走得更远。

我想你可以改变这个函数

fn material<T: Material>(&self) -> T;

它是这样说的:任何normal都提供了一个函数material,其中调用方可以指定函数将返回的material

fn material(&self) -> &dyn Material;

然后,Sphere可以实现Normal:

impl<'a> Normal for Sphere<'a> {
    fn normal(&self, point: &Vec3) -> Ray {
        Ray::new(point, &(point - &self.center))
    }
    fn material(&self) -> &dyn Material {
        self.material
    }
}

连接到游乐场。

 类似资料:
  • 我知道我可以添加另一个像这样的特性,并添加另一层组合,但这似乎太过分了。我想我也许可以使用,但这似乎很笨拙。 我还想过让返回一个手动插入到正在使用的任何结构中,但这样就破坏了返回调用方法的相同结构类型的人机工程学(这在公共impl/trait中是一种浪费)。 我怎样才能把它组织起来,而不使它的特性一直下降?

  • 我有一个组件文件夹。它们用一个文件公开,如下所示: 我有一个名为Status的JSX组件,如下所示: 它的任务是加载命名组件的行。 然后我有一个名为的组件,看起来像这样: 从'react'导入React 通过

  • 在我开发的一个应用程序上,我试图为应用程序的页面保留一个好的、可读的url。我从url开始,如下所示:http://somedomain.com/context/?param1=value getRequestCycle()。setResponsePage(新建其他页面(obj1、obj2、pageParameters) 在这里,目标1和目标2是初始化页面所需的对象。正如我从这篇文章中理解的那样,

  • 我正在尝试制作VGA文本动画的操作系统,但它的处理速度非常快。 所以,我想做“等待”功能,每次等待100毫秒,但我不知道如何不用std板条箱。 那么问题是,我如何在没有性病的情况下睡觉/等待生锈? 谢谢

  • 问题内容: 我正在寻找一个窍门。我知道如何在JavaScript中调用动态的任意函数,并传递特定的参数,如下所示: 我知道如何使用内部的集合传递可选的,无限制的参数,但是,我不知道如何发送任意数量的参数以动态发送给它;我该如何完成这样的工作,但是要有任意数量的可选参数(不要使用丑陋的– )? 问题答案: 使用函数的apply方法:- 编辑 :在我看来,这将是一个稍微的调整会更有用: 这将在浏览器之

  • 问题内容: 我有以下组成部分: 是否可以选择需要更新哪些状态属性及其值? 我已经试过了: 这样它就可以像这样使用: 但它不起作用(状态无法更新)。 问题答案: 您可以通过两种方式做到这一点: 或有点更高级: 假设是要更新的属性的名称。