String Rust编译器选择集合::字符串而不是std::字符串
我很难弄清楚为什么rustc假设我想使用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
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
中有fromstd::String::String
,而不是collections::String::String
,因为我没有指定要使用collections板条箱中的String
有人能告诉我为什么我会看到这种行为吗?提前感谢您的帮助
std
主要是与pub use
-std::string
是collections::stringRust有一个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
justpush_bytes()
(首先,您认为它为什么会这样做?)。这是有原因的<代码>字符串保证是正确的UTF-8序列,因此将任意字节推送到该序列是不安全的-您可以轻松推送无效UTF-8的字节序列,从而破坏保证
如果需要处理字节,则应使用,这是一个通用的可增长字节缓冲区。当您完成向其推送新字节时,如果您确定这些字节表示有效的UTF-8,您可以使用静态方法(或者从utf8有损(),或者从utf16()/
从utf16有损()
,如果您的输入是UTF-16),有效地将Vec
转换为字符串
。我为什么认为这样做了?嗯,String
曾经包含那个不安全的函数,直到几周前我猜,当我的代码开始崩溃。然后,我再次检查文档,发现std::string::string
包含函数,但collections::string::string
没有。认为编译器选择了错误的字符串。现在,再看看std::string::string,我可能碰到了麻省理工学院托管的旧文档,感到困惑。事实上,它被删除了。我从来不知道有这样的方法。(对不起,如果我的话对你来说很刻薄,我真的没有冒犯你的意思!)