下面代码中, 在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;
}
}
1
共 3 条评论, 1 页
评论区
写评论函数 replace_uri 没有使用 self,可以把 &mut self 去掉
你说的对. 这里确实不应该这么设计.
对于在一个 &mut self的方法A中, 要调用另一个&self或者&mut self的方法B, 但是B的参数如果是&self.member, 还是会违反借用规则, 这种情况下除了用Option包起来take, 或者用Cell, RefCell外,貌似没有啥别的好办法来处理.
--
👇
araraloren: 先把
uri
s都创建好,然后再赋值,replace_uri
的self
不能为&mut
,你已经引用了media_list
的东西 不过,你的replace_uri
都没有用到self
的东西,就是一个工具函数,没必要这样设计先把
uri
s都创建好,然后再赋值,replace_uri
的self
不能为&mut
,你已经引用了media_list
的东西 不过,你的replace_uri
都没有用到self
的东西,就是一个工具函数,没必要这样设计