我有一段go代码-
type Server struct {
enforcerMap map[int]*casbin.Enforcer
adapterMap map[int]persist.Adapter
}
func NewServer() *Server {
s := Server{}
s.enforcerMap = map[int]*casbin.Enforcer{}
s.adapterMap = map[int]persist.Adapter{}
return &s
}
func (s *Server) getEnforcer(handle int) (*casbin.Enforcer, error) {
if _, ok := s.enforcerMap[handle]; ok {
return s.enforcerMap[handle], nil
} else {
return nil, errors.New("enforcer not found")
}
}casbin.Enforcer是这样的-
type Enforcer struct {
modelPath string
// ...
}链接- https://github.com/casbin/casbin/blob/master/enforcer.go#L33
而persist.Adapter是-
type Adapter interface {
// LoadPolicy loads all policy rules from the storage.
LoadPolicy(model model.Model) error
// ...
}链接- https://github.com/casbin/casbin/blob/master/persist/adapter.go#L47
rust中相应的结构和特征是-
pub struct Enforcer {
model: Box<dyn Model>,
// ...
}链接- https://github.com/casbin/casbin-rs/blob/master/src/enforcer.rs#L58
和
pub trait Adapter: Send + Sync {
async fn load_policy(&self, m: &mut dyn Model) -> Result<()>;
async fn load_filtered_policy<'a>(
&mut self,
m: &mut dyn Model,
f: Filter<'a>,
) -> Result<()>;
// ...
}链接- https://github.com/casbin/casbin-rs/blob/master/src/adapter/mod.rs#L22
我想把代码移植到rust。我写了这个结构体-
pub struct Server {
enforcerMap: Enforcer,
adapterMap: Box<dyn Adapter>,
}但是我不能理解如何实现NewServer()和getEnforcer()。
发布于 2021-06-25 05:56:33
在go代码中,NewServer()函数只创建服务器结构的一个实例,并初始化服务器实例中包含的哈希图,因此您的rust代码将与此类似。rust使用的hashmap可以在std::collections中找到,还有其他有用的数据类型。所以,稍微编辑一下你的结构,添加一个类似于go代码的map
use std::collections::HashMap;
pub struct Server {
enforcerMap: HashMap<i32,Enforcer>,
adapterMap: HashMap<i32,Box<dyn Adapter>>,
}然后对于NewServer函数
impl Server {
pub fn NewServer()->Self {
Self {
enforcerMap:HashMap::new(),
adapterMap:HashMap::new(),
}
}
}https://stackoverflow.com/questions/68123044
复制相似问题