叁山芜比丘 2023-08-29 21:48 采纳率: 50%
浏览 1

不清楚这个无厘头的来回调用

我在看那个rust的一个关于字体的开源代码的时候在ab_glyph下的font.rs这个文件中发现了一种十分无厘头的东西就和下面这个类似原文中是Font,但是通篇都没有对他里面定义的函数写逻辑,就是相互调用

trait M {
        fn add(&self,a:i32)->i32;
    }
    impl<F:M>M for &F{
        fn add(&self,a:i32)->i32{
            (*self).add(a)
        }
    }

不知道为什么.
我就按照我写的这个简单的运行了一下但是不报错.

pub trait Font {
   fn glyph_id(&self, c: char) -> GlyphId;
}
impl<F: Font> Font for &F {
    #[inline]
    fn glyph_id(&self, c: char) -> GlyphId {
        self.0.glyph_id(c)
    } 
}

这是原来的,没有写全.但好像都没有函数的逻辑



  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2023-08-29 22:43
    关注

    引用 皆我百晓生 小程序回复内容作答:
    这段代码是 Rust 中的 trait 和 impl 的使用方式。具体来说,trait 是一种定义行为的抽象类型,而 impl 用于为具体的类型实现这些行为。

    在你给出的代码中,定义了一个 trait M 和一个 impl 块,其中 &F 是 M 的实现者。这意味着任何实现了 M 的类型的引用也可以被视为 M 的实现者。

    在第二段代码中,定义了一个 trait Font 和一个 impl 块,其中 &F 是 Font 的实现者。这意味着任何实现了 Font 的类型的引用也可以被视为 Font 的实现者。

    们可以看到,这里没有在 impl 块中写函数的具体逻辑,而是直接通过调用 self.0.glyph_id(c) 来转发到相应的实现上。这种方式通常被称为委派实现,即通过实现类型的引用来实现 trait,而不是直接实现。

    这种设计方式的好处是可以避免代码的重复,通过委派实现可以共享相同的逻辑。在你给出的示例中,可能是因为具体的实现函数是在其他地方实现的,因此在这里只是进行了转发。如果你想了解更多关于 trait 和 impl 的用法,可以查看 Rust 的相关文档。

    评论

报告相同问题?

问题事件

  • 创建了问题 8月29日

悬赏问题

  • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
  • ¥15 安装quartus II18.1时弹出此error,怎么解决?
  • ¥15 keil官网下载psn序列号在哪
  • ¥15 想用adb命令做一个通话软件,播放录音
  • ¥30 Pytorch深度学习服务器跑不通问题解决?
  • ¥15 部分客户订单定位有误的问题
  • ¥15 如何在maya程序中利用python编写领子和褶裥的模型的方法
  • ¥15 Bug traq 数据包 大概什么价
  • ¥15 在anaconda上pytorch和paddle paddle下载报错
  • ¥25 自动填写QQ腾讯文档收集表