String Rust编译器选择集合::字符串而不是std::字符串

String Rust编译器选择集合::字符串而不是std::字符串,string,rust,String,Rust,我很难弄清楚为什么rustc假设我想使用collection::string::string而不是std::string::string 我没有直接的use语句将其拉入,并且有特定的use语句声明 这是我的板条箱根目录的简化版本: extern crate serialize; extern crate collections; use std::str; use std::string::String; use std::io::{TcpListener, TcpStream}; use s

我很难弄清楚为什么rustc假设我想使用
collection::string::string
而不是
std::string::string

我没有直接的use语句将其拉入,并且有特定的use语句声明

这是我的板条箱根目录的简化版本:

extern crate serialize;
extern crate collections;

use std::str;
use std::string::String;
use std::io::{TcpListener, TcpStream};
use std::io::{Listener, Acceptor};
use self::serialize::json;
use self::serialize::json::Json;
use self::collections::tree_map::TreeMap;

use self::socket::Socket;
use self::socket::event::Event;
use self::socket::action::Action;
use self::socket::message::{Message, Text, Binary};
use self::server::Server;
use self::httpheader::{RequestHeader, ReturnHeader};
use self::socketmessenger::SocketMessenger;

pub mod socket;
pub mod server;
mod httpheader;
mod socketmessenger;
这是我的mod抛出错误的顶部:

extern crate "rust-crypto" as rust_crypto;

use self::rust_crypto::digest::Digest;
use self::rust_crypto::sha1::Sha1;
use super::serialize::base64::{ToBase64, STANDARD};
use super::std::string::String;

pub struct RequestHeader {
    pub upgrade: String,
    pub connection: String,
    pub host: String,
    pub origin: String,
    pub pragma: String,
    pub cache_control: String,
    pub sec_websocket_key: String,
    pub sec_websocket_version: String,
    pub sec_websocket_extensions: String,
    pub user_agent: String
}
编译器给了我:

src/httpheader/mod.rs:156:25: 156:42 error: type `collections::string::String` does not implement any method in scope named `push_bytes`
src/httpheader/mod.rs:156             stringified.push_bytes(bytes);
当我尝试将字节推送到字符串上时,如下所示:

unsafe {
    let bytes = self.sec_websocket_accept.as_bytes();
    stringified.push_bytes(bytes);
}
我假设我的
String
中有from
std::String::String
,而不是
collections::String::String
,因为我没有指定要使用collections板条箱中的
String


有人能告诉我为什么我会看到这种行为吗?提前感谢您的帮助

std
主要是与
pub use
-
std::string
collections::string

Rust有一个
pub use
的概念,它从模块中重新导出标识符。例如,这里:

pub mod a {
    pub use b::Struct;
}

pub mod b {
    pub struct Struct;
}
您可以从
a
b
使用
Struct

use a::Struct;
// or
use b::Struct;
这个机制在Rust标准库中被大量使用。特别是,
std
功能的很大一部分实际上是在其他板条箱中定义的,并由
std
重新导出以方便使用<例如,code>String
是在
collections
板条箱中定义的,但是,它由
std::String
模块重新导出,更重要的是,它也由
std::prelude
重新导出,其内容自动导入所有常规模块中。这意味着
collections::string::string
,也就是
std::string::string
,可以像
string
一样访问,因此您不需要显式导入它

然而,您的问题不是导入
String
just
push_bytes()
(首先,您认为它为什么会这样做?)。这是有原因的<代码>字符串保证是正确的UTF-8序列,因此将任意字节推送到该序列是不安全的-您可以轻松推送无效UTF-8的字节序列,从而破坏保证


如果需要处理字节,则应使用,这是一个通用的可增长字节缓冲区。当您完成向其推送新字节时,如果您确定这些字节表示有效的UTF-8,您可以使用静态方法(或者从utf8有损(),或者从utf16()/
从utf16有损()
,如果您的输入是UTF-16),有效地将
Vec
转换为
字符串

我为什么认为这样做了?嗯,
String
曾经包含那个不安全的函数,直到几周前我猜,当我的代码开始崩溃。然后,我再次检查文档,发现
std::string::string
包含函数,但
collections::string::string
没有。认为编译器选择了错误的字符串。现在,再看看std::string::string,我可能碰到了麻省理工学院托管的旧文档,感到困惑。事实上,它被删除了。我从来不知道有这样的方法。(对不起,如果我的话对你来说很刻薄,我真的没有冒犯你的意思!)