【问题标题】:Should I add a fifetime for variable or pass it between functions Rust我应该为变量添加一个 fifetime 还是在函数 Rust 之间传递它
【发布时间】:2022-08-02 23:41:04
【问题描述】:

我有一个 LdapConn,我将它传递给多个函数。 目前我正在将 ldap 变量传递给一个函数,然后返回它。在函数内部,我没有对 ldapConn 进行任何危险的修改,我只是更改了搜索结果部分。传递它是可行的,但是使变量持续我的程序长度的最佳方法是什么?

//main.rs
    let mut ldap: LdapConn = LdapConn::with_settings(
        LdapConnSettings::new()
            .set_no_tls_verify(true)
            .set_starttls(true),
        \"ldaps://ldap.example.com:636\",
    )
    .unwrap();
//other_file.rs
pub fn get_group_members(group: &str, mut conn: LdapConn) -> (LdapConn, Vec<String>) {
    let (s_filter, ou) = split_dn(group);
    let search_result = conn
        .search(
            &ou,
            Scope::Subtree,
            &format!(\"(&(objectClass=group)({}))\", s_filter),
            vec![\"member\"],
        )
        .unwrap();
    let resp: Vec<
        std::collections::HashMap<std::string::String, std::vec::Vec<std::string::String>>,
    > = search_result
        .0
        .iter()
        .map(|x| SearchEntry::construct(x.clone()).attrs)
        .collect();

    (conn, trim_users(resp[0].get(\"member\").unwrap().to_vec()))
}
//main.rs
    let (ldap, users) = get_group_members(group, ldap);

    标签: rust


    【解决方案1】:

    你应该总是尽可能地采取干扰最小的事情。这意味着:如果您可以使用&amp;,您应该这样做。如果没有,如果可以的话,您应该使用&amp;mut。只有当你别无选择时,你才应该拥有一个价值。在您的情况下,您将需要对连接的唯一访问权限,因此&amp; 是不可能的。但是,&amp;mut 是公平的游戏。

    pub fn get_group_members(group: &str, conn: &mut LdapConn) -> Vec<String> {
      ...
    }
    
    // main.rs
    let mut ldap = ...;
    let users = get_group_members(group, &mut ldap);
    

    您偶然发现的(即您可以传递所有权并将其收回)称为linear typing。它是 Rust 类型系统的起源,借用检查器就是在此基础上构建的。本来就没有什么错误的(数学上)总是传递所有权并收回它,除了不断地接受你刚刚放弃的东西的所有权变得非常乏味。这正是 Rust 允许借用的原因,以防止这种情况失控。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 2010-10-21
      • 2019-09-12
      • 2020-07-02
      • 1970-01-01
      • 1970-01-01
      • 2016-09-07
      相关资源
      最近更新 更多