- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想从 Vec<String>
随机读取一个文件然后将其用作 reqwest async 的多部分
但我不断得到:
这是功能
fn getFiles(dirname: &str) -> Vec<String> {
let mut items: Vec<String> = Vec::new();
let dir = std::fs::read_dir(dirname);
for item in dir.expect("fail") {
if let Ok(item) = item {
items.push(item.path().into_os_string().into_string().unwrap());
}
}
items
}
// call the function
let dir_items = getFiles("src/assets");
let file = dir_items.into_iter().choose(&mut rand::thread_rng()).unwrap();
let path = std::path::Path::new(&file);
let sub_file = std::fs::read(path)?;
// after this, file lifetime is already end ?
let sub_file_part = reqwest::multipart::Part::bytes(sub_file)
.file_name(path.file_name().unwrap().to_string_lossy())
.mime_str("application/octet-stream")?;
playground
最佳答案
让我们逐个看一下:
let path = std::path::Path::new(&file);
如果你看看
the documentation for Path::new
,您会看到以下签名:
pub fn new<S: AsRef<OsStr> + ?Sized>(s: &S) -> &Path
应用第二个
lifetime elision rules 后,(引用:“如果只有一个输入生命周期参数,则该生命周期将分配给所有输出生命周期参数:
fn foo<'a>(x: &'a i32) -> &'a i32
”),此签名实际上如下所示:
pub fn new<'a, S: AsRef<OsStr> + ?Sized>(s: &'a S) -> &'a Path
所以,你的
path
变量的生命周期不能超过你的
file
多变的。
.file_name(path.file_name().unwrap().to_string_lossy())
再次应用生命周期省略规则后,您可以看到调用
unwrap
在
path.file_name()
给你一个
&std::ffi::OsStr
生命周期不能超过你的
path
反过来(如前所述)的变量不能比你的
file
多变的。所以,传递地,
path.filename().unwrap()
活不过
file
多变的。
OsStr::to_string_lossy()
的签名。 :
pub fn to_string_lossy(&self) -> Cow<'_, str>
因此,此方法返回
Cow<'_, str>
.
Cow
是“复制或拥有”的简写——意味着
Cow
可以包含对数据的引用(在本例中为
&str
,如果
OsStr
仅包含有效的 UTF-8 字节),或者它可以拥有数据本身(在本例中,通过包含
String
,如果
OsStr
包含需要在 UTF-8 转换期间转换或过滤掉的数据)。
'_
is a placeholder and means that the compiler shall (again) infer the lifetime with the lifetime elision rules .扩展签名如下所示:
pub fn to_string_lossy<'a>(&'a self) -> Cow<'a, str>
因此,在您的示例中,
'a
不能大于
&OsStr
的生命周期由
unwrap()
返回,这意味着
'a
不能大于
file
的生命周期.
reqwest::multipart::Part::file_name()
期望实现
Into<Cow<'static, str>>
作为参数。我们的
Cow<'a, str>
绝对无法实现,因为我们的
file
变量在程序结束之前是不活跃的。如果它在程序结束之前还活着,我们的
Cow
会实现它,因为
file
可借
'static
,一切都会好起来的——这就是错误消息的原因。
into_owned()
来解决此问题。在
Cow
.这将转换
Cow
成一个字符串,它确实实现了
Into<Cow<'static, str>>
:
use rand::prelude::*;
fn getFiles(dirname: &str) -> Vec<String> {
let mut items: Vec<String> = Vec::new();
let dir = std::fs::read_dir(dirname);
for item in dir.expect("fail") {
if let Ok(item) = item {
items.push(item.path().into_os_string().into_string().unwrap());
}
}
items
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
// call the function
let dir_items = getFiles("src/assets");
let file = dir_items.into_iter().choose(&mut rand::thread_rng()).unwrap();
let path = std::path::Path::new(&file);
let sub_file = std::fs::read(path)?;
// after this, file lifetime is already end ?
let sub_file_part = reqwest::multipart::Part::bytes(sub_file)
.file_name(path.file_name().unwrap().to_string_lossy().into_owned())
.mime_str("application/octet-stream")?;
Ok(())
}
Playground
关于rust - 从字符串的随机 Vec 读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68698767/
假设我有一个组织 ID 向量 let orgs = vec![1, 3, 14, 12]; 然后我调用 .iter()在 each 上获取每个组织的事件,其中函数 get_events_for()返回
这个问题已经有答案了: What are Rust's exact auto-dereferencing rules? (4 个回答) 已关闭 3 年前。 我很困惑为什么这个函数 get适用于 Vec
let a = vec![ vec![1, 2], vec![3, 4], vec![5, 6] ]; 怎么才能聚成一个Vec包含在所有 Vec 中的所有值s 在 a ? 最佳答案 您可以使用 fla
我在HashMap, Vec>中有数据,我想将该数据作为字节缓冲区(单个Vec)写入文件,然后从文件中读取回去并重建HashMap结构。 是否有建立像这样的平坦化和恢复 map 的算法?我可以将元数据
我正在寻找一种“使用rust ”的方式来将 Vec 累积到 Vec 中,以便将每个内部 Vec 的第一个元素加在一起,将每个 Vec 的每个第二个元素加在一起,等等......,并将结果收集到 Vec
我正在寻找一种“使用rust ”的方式来将 Vec 累积到 Vec 中,以便将每个内部 Vec 的第一个元素加在一起,将每个 Vec 的每个第二个元素加在一起,等等......,并将结果收集到 Vec
我正在尝试使用 selection_sort 创建一个已排序的向量,同时保留原始未排序的向量: fn main() { let vector_1: Vec = vec![15, 23, 4,
在 https://doc.rust-lang.org/std/vec/struct.Vec.html#method.iter , 我只能在页面左侧的索引侧边栏中找到iter。但是,找不到 iter_
我正在尝试从 Vec> 创建一个集合向量 ( Vec> ) .这是我目前的进展: use std::collections::BTreeSet; fn main() { // The data
我错过了向量向量初始化的一些东西。在第一种方法中,我尝试了这段代码: let mut landFirst: Vec> = Vec::with_capacity(width); for v in lan
我想设计一个类似于示例 here 的函数除了我的情况,iproduct 的参数数量在编译时是未知的。正如 here 所解释的那样,这在 python 中很容易完成。 . 我已经尝试使用 itertoo
我有一个我不明白的问题: fn cipher_with(key: &[u8], data: &[u8]) -> Vec { let data_len = 16; let mut dat
我刚开始学习 Rust,我偶然发现了这个愚蠢的问题: error: mismatched types: expected `&[u8]` but found `&collections::vec::V
这个问题在这里已经有了答案: How to filter a vector of custom structs? (1 个回答) 关闭 4 年前。 我有一个接受 &Vec 的函数(其中 Word 是
试图创建一个 HashMap 的数据库结构向量。每个Vec包含 Box . use std::collections::HashMap; trait Model { fn id(&self)
我正在编写一个使用 Vec> 的库类型以按列优先顺序存储数据(每个内部 Vec 代表一列)。用户可以创建 Vec>具有任何行和列长度,但所有列都被限制为相同的长度。 有时我需要高效地遍历 Vec>按行
在 GLSL 中我不明白什么是“in”和“out”变量,这是什么意思?这是我从教程中复制的代码示例。 // Shader sources const GLchar* vertexSource =
例如 [[5,6][2,3][2,5][2,9][1,6]]先按第一个元素升序排序,当一个元素相等时,按第二个元素降序排序,得到[1,6],[2,9],[2,5],[2,3] ],[5,6] 最佳答案
我正在尝试为类型为Vec>的向量创建可变的迭代器 迭代器代码: pub struct IterMut { iter: &'a mut Vec>, ix: usize, inne
我是 rust 编程的新手。我想用递归实现合并排序。这是我的代码: fn merge(a: &mut Vec, b: &mut Vec) -> Vec { let mut temp: Vec
我是一名优秀的程序员,十分优秀!