由于我有很强的弱类型编程背景,我对 rust 病非常、非常陌生,并与之斗争.
下面的代码应该将通过PYO3从Python接收的数据写入XLSX工作表.我只是不知道如何处理最后一个匹配,因为"value"的类型是PyAny(也就是说,它的方法extract可以输出多种类型,如String、f32等,我希望根据提取的类型有一个特定的行为).
也许我可以 for each 潜在的提取类型链接匹配(如果第一个输出错误,请try 下一个),但我怀疑可能有更好的方法.也许我只是用一个错误的设计来解决这个问题.欢迎有任何见解.
pub trait WriteValue {
fn write_value(&self, worksheet: &mut Worksheet, row: u32, col: u16, format: Option<&Format>) -> Result<(), XlsxError>;
}
impl WriteValue for String {
fn write_value(&self, worksheet: &mut Worksheet, row: u32, col: u16, format: Option<&Format>) -> Result<(), XlsxError> {
worksheet.write_string(row, col, &self, format)
}
}
impl WriteValue for f32 {
fn write_value(&self, worksheet: &mut Worksheet, row: u32, col: u16, format: Option<&Format>) -> Result<(), XlsxError> {
worksheet.write_number(row, col, f64::from(*self), format)
}
}
fn _write(path: &str, data: HashMap<u32, &PyList>, _highlight: Option<&PyDict>) -> Result<(), XlsxError> {
let workbook = Workbook::new(path);
let mut worksheet = workbook.add_worksheet(None)?;
let format_bold = workbook.add_format().set_bold();
for (row_index, values) in data {
let mut col_idx: u16 = 0;
for value in values {
col_idx += 1;
let row_format= match &row_index {
0 => Some(&format_bold),
_ => None
};
match value.extract::<String>() {
Ok(x) => x.write_value(&mut worksheet, row_index.clone(), &col_idx -1, row_format)?,
Err(_) => { }
}
}
}
workbook.close()
}