Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics 锈蚀:通用型必须为机具和;xx[…]_Generics_Rust_Bounds - Fatal编程技术网

Generics 锈蚀:通用型必须为机具和;xx[…]

Generics 锈蚀:通用型必须为机具和;xx[…],generics,rust,bounds,Generics,Rust,Bounds,我正在尝试实现一个通用结构,从一开始就很清楚,它的元素“provider”必须是稍后支持&myvar.provider[…]的类型。但我无法找到正确的界限 pub struct MyStruct<T: ??> { // T must support &x.provider[..] pub provider: T, } pub-struct-MyStruct{//T必须支持&x.provider[…] 酒吧提供者:T, } 非常感谢你的帮助 更新:扩展示例。我想要实

我正在尝试实现一个通用结构,从一开始就很清楚,它的元素“provider”必须是稍后支持&myvar.provider[…]的类型。但我无法找到正确的界限

pub struct MyStruct<T: ??> {  // T must support &x.provider[..]
   pub provider: T,
}
pub-struct-MyStruct{//T必须支持&x.provider[…]
酒吧提供者:T,
}
非常感谢你的帮助

更新:扩展示例。我想要实现的是:数据块可以达到10GB。它们可以作为静态b“aa”提供,主要用于测试、将文件内容读入内存或mmap文件内容。无论提供程序是什么,在处理数据时,我们只使用&[u8]

//
// A minimal example for my problem
//

use std::str;
use std::error::Error;
use std::fs::File;
use std::io::prelude::*;
use std::boxed::Box;
use memmap::{MmapOptions, Mmap};

#[derive(Debug)]
pub struct DBFileBuilder<T> {  // what is the correct bound? T must support &x[..]
    pub filename: String,
    pub provider: Option<T>,
    pub startpos: usize,
    // ... several more 
}

pub struct DBFile<'a, T> {  // what is the correct bound? T must support &x[..]
    pub filename: String,
    pub provider: T,
    pub data: &'a [u8],
    // ... several more 
}

impl<T> DBFileBuilder<T> {
    fn default() -> Self {
        Self { 
            filename: String::default(), 
            provider: None,
            startpos: 0,
        }
    }

    pub fn from_bytes(data: &[u8]) -> DBFileBuilder<&[u8]> {
        DBFileBuilder { 
            provider: Some(&data),
            ..DBFileBuilder::default() 
        }
    }

    pub fn read_file(filename: &str) -> Result<DBFileBuilder<Box<[u8]>>, Box<dyn Error>> {
        let mut file = File::open(&filename)?;
        let fsize = file.metadata()?.len();

        let mut provider = vec![0_u8; fsize as usize].into_boxed_slice();
        let n = file.read(&mut provider)?;

        Ok(DBFileBuilder {
            filename: filename.to_string(),
            provider: Some(provider),
            ..DBFileBuilder::default()
        })
    }

    pub fn mmap_file(filename: &str) -> Result<DBFileBuilder<Mmap>, Box<dyn Error>> {
        let file = File::open(&filename)?;
        let provider = unsafe { MmapOptions::new().map(&file)? };

        Ok(DBFileBuilder {
            filename: filename.to_string(),
            provider: Some(provider),
            ..DBFileBuilder::default()
        })
    }

    pub fn init(&mut self) {
    }

    pub fn build<'a>(self) -> DBFile<'a, T> {
        let provider = self.provider.expect("Provider not initialized");
        self.init();
        let data = &provider[self.startpos ..];

        DBFile {
            filename: self.filename,
            provider,
            data,
        }
    }
}

impl<'a, T> DBFile<'a, T> {
    pub fn run(&self) { 
        return self.process(self.data)
    } 

    pub fn process(&self, data: &[u8]) { 
        println!("data: {:?}", &data); 
    }
}
//
//我的问题的一个最简单的例子
//
使用std::str;
使用std::error::error;
使用std::fs::File;
使用std::io::prelude::*;
使用std::boxed::Box;
使用memmap::{MmapOptions,Mmap};
#[导出(调试)]
pub struct DBFileBuilder{//正确的绑定是什么?T必须支持&x[…]
发布文件名:String,
发布提供者:选项,
酒吧开始:使用,
//……还有几个
}
pub结构DBFile Self{
自{
文件名:String::default(),
提供者:无,
startpos:0,
}
}
pub fn from_字节(数据:&[u8])->DBFileBuilder{
DBFileBuilder{
提供程序:一些(数据和数据),
…DBFileBuilder::default()
}
}
pub fn read_文件(文件名:&str)->结果{
让mut file=file::open(&filename)?;
让fsize=file.metadata()?.len();
让mut provider=vec![0_u8;fsize as usize]。放入装箱的切片();
设n=file.read(&mut provider)?;
Ok(DBFileBuilder){
filename:filename.to_string(),
提供者:一些(提供者),
…DBFileBuilder::default()
})
}
pub fn mmap_文件(文件名:&str)->结果{
让file=file::open(&filename)?;
让provider=unsafe{MmapOptions::new().map(&file)?};
Ok(DBFileBuilder){
filename:filename.to_string(),
提供者:一些(提供者),
…DBFileBuilder::default()
})
}
发布fn初始(&M自我){
}
pub-fn-build{
让provider=self.provider.expect(“provider未初始化”);
self.init();
让数据=&提供程序[self.startpos..];
数据库文件{
filename:self.filename,
供应商,
数据,
}
}
}
恳求{
发布fn运行(&self){
返回self.process(self.data)
} 
发布fn进程(&self,数据:&[u8]){
println!(“数据:{:?},&数据);
}
}

通过使用闭合范围获取字节绑定到索引的必要特性是
索引
。 您可能还希望按无限范围索引:

pub struct MyStruct<T>
where T: Index<Range<usize>, Output=[u8]>
   + Index<RangeTo<usize>, Output=[u8]>
   + Index<RangeFrom<usize>, Output=[u8]>
   + Index<RangeFull, Output=[u8]>
{
    pub provider: T,
}
pub-struct-MyStruct
其中T:Index
+索引
+索引
+索引
{
酒吧提供者:T,
}
不幸的是,目前在使用
MyStruct
的签名中没有推断出这些界限(尽管我相信这一点正在研究中),这可能会变得非常笨拙。如果您使用Nightly,您可以定义一个(RFC1733)来减少这种冗长


也就是说,您需要重新考虑这个示例,因为它不起作用:例如,在
build()
中,
数据不能作为返回的
DBFile
的一部分,因为它指向一个局部变量,该变量的寿命不够长。

要澄清的是,
是其他值的替代吗?或者是字面上的一个?我也有点困惑你在找什么。能否提供一个代码示例,说明您打算如何使用
MyStruct
provider
?非常感谢。这是一个非常好的提示,尽管我最终使用了
T:AsRef
,因为它也可以处理&[u8]输入数据。请看