何时对空结构使用impl

  • 本文关键字:impl 结构 何时 rust
  • 更新时间 :
  • 英文 :


我在互联网上看到了以下代码:

pub struct Processor;
impl Processor {
pub fn process(
) -> i32 {
// some stuff here
}
}

并用作:

let a = Processor::process();

这里有struct有什么好处?没有它,同样的事情能以某种方式实现吗?

以下是您可能遇到的几个更常见的示例。我相信还有一些我忘记了,但这些将有望在未来阅读铁锈代码时对您有所帮助。

创建结构以容纳特性的不同实现

您可能会发现自己处于这样一种情况:能够使用自定义处理程序会很好,但希望避免在每个结构中存储函数的开销。一个简单的选择是为它创建一个特性,并定义类型,唯一的目的是在它们上实现不同版本的特性。

这样,您就可以像编译时类型修饰符一样使用它们,这样以后就可以轻松地交换或重新定义核心功能,而不会有任何额外的开销或需要将额外的信息存储在结构中。

trait Smoothing {
fn smooth(a: i32, b: i32) -> i32;
}
struct LinearStrategy;
impl Smoothing for LinearStrategy {
fn smooth(a: i32, b: i32) -> i32 {
(a + b) / 2
}
}
struct GeometricStrategy;
impl Smoothing for GeometricStrategy {
fn smooth(a: i32, b: i32) -> i32 {
i32::sqrt(a * a + b * b)
}
}
struct ComplexStruct<T> {
/* etc. */
_phantom: PhantomData<T>,
}
// Change how ComplexStruct operates at compile time
impl<T: Smoothing> ComplexStruct<T> {
pub fn sample(&self, x: i32) -> i32 {
T::smooth(self.raw_sample(x - 1), self.raw_sample(x + 1))
}
}

我能找到的最好的例子可能是Vec。一开始可能看起来不像,但Vec有两个类型参数。在Vec<T, A = Global>中,AVec使用的分配器。默认情况下,它被设置为全局分配器,但在某些情况下,可以很方便地将它与其他东西切换,并且仍然可以访问Vec的所有正常功能。

外国金融机构的占位符

当为C/其他库创建rustAPI时,添加类型以镜像不包含相同数据的C api可能是有意义的。通常情况下,指针会被一个安全的铁锈替代品和一个占位符生存期包裹起来(因为铁锈不拥有这些数据(。

pub struct Foo<'a> {
ptr: *mut sys::Foo,
_phantom: PhantomData<&'a ()>,
}

然而,在需要强制为资源调用构造函数/析构函数的情况下,使用结构也可能是有意义的。由于Rust在结构的drop函数超出范围时调用该函数,然后从内存中删除,因此很容易执行这些规则。在这种情况下,通过有一个结构,我们可以强制执行一些先决条件,以获得对结构中函数的访问权限。

pub struct FooApi;
impl FooApi {
pub fn new() -> Self {
unsafe { sys::init_thread_foo(); }
FooApi
}
/// Some call that is only safe if sys::init_thread_foo() has been called
pub fn do_something(&self) { /* ... */}
}
/// Call FFI function to dispose of this resource once this FooApi is no longer needed
impl Drop for FooApi {
fn drop(&mut self) {
unsafe {
sys::dispose_thread_foo();
}
}
}

详细程度

有时,结构可能会被模块所取代。然而,根据开发人员的不同,他们可能更喜欢使用结构,而不是在更具概念意义的情况下考虑对对象进行操作。通常,这些情况相当罕见,通常表明一个类型以前或将来会被划分为特征并被通用。或者,它也可以用于有两个等效但不完全相同的替代方案的情况(例如:CPU类型(。

到目前为止,这是我脑海中浮现的几个原因,但我可能会回来补充更多。

最新更新