gpt4 book ai didi

rust - 使用 Rust Add trait 引入副作用

转载 作者:行者123 更新时间:2023-11-29 08:17:15 24 4
gpt4 key购买 nike

我正在学习 Rust,为了练习,我正在尝试实现 Instrumented<T>输入:

  • 有一个 value类型字段 T ;
  • 支持 T 的所有基本操作支持,例如,相等、排序、算术;
  • 将所有这些操作委托(delegate)给 T并对调用进行计数;
  • 打印一份不错的报告。

这个想法是从 Alexander Stepanov 的编程类(class)中借用的,他在类(class)中用 C++ 实现了这个东西。使用 Instrumented<T> , 人们可以很容易地衡量 T 类型上任何算法的复杂性在基本操作方面,以一种非常通用的方式,利用 Rust 的特征系统。

首先,我尝试实现一个非通用的 InstrumentedIntAdd additions 中所有添加项的特征和计数 field 。完整代码:http://is.gd/AnF3Rf

这是特征本身:

impl Add<InstrumentedInt, InstrumentedInt> for InstrumentedInt {
fn add(&self, rhs: &InstrumentedInt) -> InstrumentedInt {
self.additions += 1;
InstrumentedInt {value: self.value + rhs.value, additions: 0}
}
}

当然它不起作用因为&self是一个不可变指针,它的字段不能被赋值。

  • 试图声明 add 的参数函数可变,但编译器说它与特征定义不兼容。
  • 声明addimpl InstrumentedInt没有Add特征,这不提供对加法的支持(没有鸭子类型)。
  • 将操作数定义为可变的,不会产生任何影响。

这有可能吗?

P. S. 之后,我将:

  • 替换additions带有指向可变数组 uint 的指针, 计算许多操作,而不仅仅是加法;
  • 使这个指针在InstrumentedInt 的所有实例之间共享,也许只是在构造函数中提供一个参数,
  • 将类型泛化为 Instrumented<T> ;
  • 理想情况下,尝试为不同的专业制作隐式和独特的计数器。例如,如果算法同时使用 intf32 , Instrumented<int>Instrumented<f32>应该有不同的计数器。

也许这些对解决我当前的问题很重要。

谢谢!

最佳答案

这正是 various kinds of cells 的用例.单元格提供实现内部可变性的工具,即&引用背后的可变性。例如,在您的情况下 InstrumentedInt 可能如下所示:

struct InstrumentedInt {
value: int,
additions: Cell<uint>
}

impl Add<InstrumentedInt, InstrumentedInt> for InstrumentedInt {
fn add(&self, rhs: &InstrumentedInt) -> InstrumentedInt {
self.additions.set(self.additions.get()+1);
InstrumentedInt {value: self.value + rhs.value, additions: Cell::new(0)}
}
}

至于你之后要做的事情,你可能很难实现。它们对我来说似乎可以实现,但并不容易。例如,如果没有 unsafe,您将无法使用可变全局数据(可能可以使用 ArcMutex 等同步工具来使用没有 unsafe 的全局变量,但我从来没有这样做过,所以我现在不确定)。至于不同专业的不同计数器,您可以使用像 AnyMap 这样的库。或 TypeMap ,再次使用某种全局变量。

关于rust - 使用 Rust Add trait 引入副作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26560714/

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