Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 在Rust中设计USB手柄的共享所有权_Design Patterns_Rust - Fatal编程技术网

Design patterns 在Rust中设计USB手柄的共享所有权

Design patterns 在Rust中设计USB手柄的共享所有权,design-patterns,rust,Design Patterns,Rust,在Rust中实现低级USB驱动程序的过程中,我遇到了一个设计问题。我有以下需要配合使用的组件: MyDriver高级API 作为驱动程序调用的主要入口点的高级公共API: pub struct MyDriver { device_handle: MyDeviceHandle, device_type: Box<dyn DeviceType> } 设备特定功能 这就是事情变得棘手的地方。某些库函数依赖于运行时找到的活动设备。因此,我为此创建了一个共同特征,关键是每个D

在Rust中实现低级USB驱动程序的过程中,我遇到了一个设计问题。我有以下需要配合使用的组件:

MyDriver高级API 作为驱动程序调用的主要入口点的高级公共API:

pub struct MyDriver {
    device_handle: MyDeviceHandle,
    device_type: Box<dyn DeviceType>
}
设备特定功能 这就是事情变得棘手的地方。某些库函数依赖于运行时找到的活动设备。因此,我为此创建了一个共同特征,关键是每个
DeviceType
也需要访问
MyDeviceHandle
,以实现其逻辑

impl DeviceType for DeviceA {
    pub fn goo(self, usb_handle: &MyDeviceHandle) {
        usb_handle.one_thing();
    }
}

impl DeviceType for DeviceB {
    pub fn goo(self, usb_handle: &MyDeviceHandle)
        usb_handle.other_thing();
    }
}
当前,使每个
设备类型
都可以使用
MyDeviceHandle
的唯一方法是在每个实现的函数中传递对它的引用


有没有一种很好的方法可以让结构拥有
MyDeviceHandle
的一些共享所有权,可以在构造时实例化,然后从每个函数中重复使用?

很难理解您在做什么和想要什么,看在我看来,很奇怪您使用了动态特性,enum几乎总是更好。在我看来,每次都给出句柄是可以的,或者您需要使用enum,并将句柄放在所有devidetype@Stargateur感谢您的反馈,我想了解更多关于如何使用枚举实现某种多态性的细节。如果你能把这一点写进一个答案,我完全可以接受这一点。我想我为你找到了一篇很好的文章,可以更全面地总结一切
impl MyDriver {
    pub fn foo(self) {
        self.usb_handle.handle_foo();
    }
}
impl DeviceType for DeviceA {
    pub fn goo(self, usb_handle: &MyDeviceHandle) {
        usb_handle.one_thing();
    }
}

impl DeviceType for DeviceB {
    pub fn goo(self, usb_handle: &MyDeviceHandle)
        usb_handle.other_thing();
    }
}