< 返回版块

招宝进财 发表于 2023-08-08 13:41

下面代码中, 在transform_ts_path函数中,调用replace_uri会出现借用规则的问题. 如果不修改replace_uri的签名(必须要有self参数), 如何解决借用规则的问题

   |
57 |         for mpl in &mut self.media_list.segments {
   |                    -----------------------------
   |                    |
   |                    first mutable borrow occurs here
   |                    first borrow later used here
58 |            mpl.uri = self.replace_uri(&mpl.uri, path);
   |                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ second mutable borrow occurs here

=============================

pub struct M3U8_file {
    pub m3u8_file_path: String,
    pub ts_files_path: String,
    pub media_list: MediaPlaylist,
}

impl M3U8_file {
  

    pub fn transform_ts_path(&mut self, path: &str) {
        for mpl in &mut self.media_list.segments {
           mpl.uri = self.replace_uri(&mpl.uri, path);
        }
    }

    pub fn replace_uri(&mut self, orginal_uri: &String, path: &str) -> String {
        let delimiter = "/.";
        let sub_str = if let Some(index) = orginal_uri.find(delimiter) {
            &orginal_uri[index + delimiter.len()..]
        } else {
            ""
        };
        let replaced_uri = format!("{}/{}", path, sub_str).to_string();
        return replaced_uri;
    }
}

评论区

写评论
我心飞翔 2023-08-08 16:54

函数 replace_uri 没有使用 self,可以把 &mut self 去掉

作者 招宝进财 2023-08-08 16:20

你说的对. 这里确实不应该这么设计.

对于在一个 &mut self的方法A中, 要调用另一个&self或者&mut self的方法B, 但是B的参数如果是&self.member, 还是会违反借用规则, 这种情况下除了用Option包起来take, 或者用Cell, RefCell外,貌似没有啥别的好办法来处理.

--
👇
araraloren: 先把uris都创建好,然后再赋值,replace_uriself不能为&mut,你已经引用了media_list的东西 不过,你的replace_uri都没有用到self的东西,就是一个工具函数,没必要这样设计

araraloren 2023-08-08 14:21

先把uris都创建好,然后再赋值,replace_uriself不能为&mut,你已经引用了media_list的东西 不过,你的replace_uri都没有用到self的东西,就是一个工具函数,没必要这样设计

1 共 3 条评论, 1 页