簡體   English   中英

Rust 泛型 - 無法推斷類型參數“T”的類型

[英]Rust Generics - cannot infer type for type parameter `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]>
{ ... }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM