首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Go接口和Rust特性,并将函数从Go移植到Rust

Go接口和Rust特性,并将函数从Go移植到Rust
EN

Stack Overflow用户
提问于 2021-06-25 05:43:51
回答 1查看 157关注 0票数 0

我有一段go代码-

代码语言:javascript
复制
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是这样的-

代码语言:javascript
复制
type Enforcer struct {
    modelPath string
    // ...
}

链接- https://github.com/casbin/casbin/blob/master/enforcer.go#L33

而persist.Adapter是-

代码语言:javascript
复制
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中相应的结构和特征是-

代码语言:javascript
复制
pub struct Enforcer {
    model: Box<dyn Model>,
    // ...
}

链接- https://github.com/casbin/casbin-rs/blob/master/src/enforcer.rs#L58

代码语言:javascript
复制
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。我写了这个结构体-

代码语言:javascript
复制
pub struct Server {
    enforcerMap: Enforcer,
    adapterMap: Box<dyn Adapter>,
}

但是我不能理解如何实现NewServer()getEnforcer()

EN

回答 1

Stack Overflow用户

发布于 2021-06-25 05:56:33

在go代码中,NewServer()函数只创建服务器结构的一个实例,并初始化服务器实例中包含的哈希图,因此您的rust代码将与此类似。rust使用的hashmap可以在std::collections中找到,还有其他有用的数据类型。所以,稍微编辑一下你的结构,添加一个类似于go代码的map

代码语言:javascript
复制
use std::collections::HashMap;

pub struct Server {
    enforcerMap: HashMap<i32,Enforcer>,
    adapterMap: HashMap<i32,Box<dyn Adapter>>,
}

然后对于NewServer函数

代码语言:javascript
复制
impl Server {
    pub fn NewServer()->Self {
        Self {
        enforcerMap:HashMap::new(),
        adapterMap:HashMap::new(),
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68123044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档