Rust泛型-不能推断类型参数' T '的类型



我有一些Rust FFI代码,我想应用于i32, i64, f32, f64等。因此,使用泛型类型T可以帮助我避免重复大块代码。

在本例中,我剪切了i64并粘贴了T(并用<T>装饰了fn名称)。i64版本运行良好。

use libc::c_char;
use libc::size_t;
use std::slice;
use std::ffi::*; //{CStr, CString,}
use std::fs::File;
use std::path::{Path};
use polars::prelude::*;//{CsvReader, DataType, DataFrame, Series};
use polars::prelude::{Result as PolarResult};
pub struct SeriesC {
se: Series,
}
impl SeriesC {
fn new<T>(name: String, data: Vec::<T>) -> SeriesC {
SeriesC {
se: Series::new(&name, data),
}   
}
}
#[no_mangle]
pub extern "C" fn se_new(
string: *const c_char,
data: *const *const i64,
len: size_t, 
) -> *mut SeriesC {
let se_name = unsafe {
CStr::from_ptr(string).to_string_lossy().into_owned()
};  
let mut se_data: Vec<i64> = Vec::<i64>::new();
unsafe {
assert!(!data.is_null());
for item in slice::from_raw_parts(data, len as usize) {
se_data.push(*item as i64);
};  
};  
Box::into_raw(Box::new(SeriesC::new(se_name, se_data)))
}

似乎无论我做什么都会出错。我也考虑过数组而不是Vecs,但我很确定我想要Vecs,因为在编译时长度是未知的。这个尝试说:

error[E0277]: the trait bound `polars::prelude::Series: polars::prelude::NamedFrom<Vec<T>, _>` is not satisfied
--> src/lib.rs:20:17
|
20 |             se: Series::new(&name, data),
|                 ^^^^^^^^^^^ the trait `polars::prelude::NamedFrom<Vec<T>, _>` is not implemented for `polars::prelude::Series`
|
= help: the following implementations were found:
<polars::prelude::Series as polars::prelude::NamedFrom<&polars::prelude::Series, str>>
<polars::prelude::Series as polars::prelude::NamedFrom<T, ListType>>
<polars::prelude::Series as polars::prelude::NamedFrom<T, T>>
<polars::prelude::Series as polars::prelude::NamedFrom<T, [&'a str]>>
and 33 others

感谢收到任何建议!

当编译器知道类型是i64时,它可以看到Series实现了所需的NamedFrom转换特性,因为极地库提供了实现impl<T> NamedFrom<T, [i64]> for Series where T: AsRef<[i64]>。当T完全无界时,NamedFrom没有实现——有一些类型可以替代T,而NamedFrom没有实现。

要使此工作具有通用性,您需要添加一个合适的绑定,以便编译器知道Series上有NamedFrom<Vec<T>, [T]>实现,这将适当地将SeriesC::new()函数的使用限制为T类型,例如存在实现。

fn new<T>(name: String, data: Vec::<T>) -> SeriesC
where Series: NamedFrom<Vec<T>, [T]>
{ ... }

最新更新