这看起来微不足道,但我找不到办法.
例如,
fn f(s: &[u8]) {}
pub fn main() {
let x = "a";
f(x)
}
Run Code Online (Sandbox Code Playgroud)
无法编译:
error: mismatched types:
expected `&[u8]`,
found `&str`
(expected slice,
found str) [E0308]
Run Code Online (Sandbox Code Playgroud)
但是,文件指出:
strs的实际表示具有与切片的直接映射:&str与&[u8]相同.
Python的itertools实现了一个链迭代器,它基本上连接了许多不同的迭代器,以提供单个迭代器的所有东西.
C++中有类似的东西吗?快速浏览一下boost库并没有发现类似的东西,这对我来说非常令人惊讶.难以实现此功能吗?
有没有办法减少矢量的容量?
我的代码将值插入到向量中(事先不知道它们的数字),当这完成时,向量仅用于读取操作.
我想我可以创建一个新的向量,用大小做一个.reseve()并复制项目,但我真的不喜欢额外的复制操作.
PS:我不关心便携式解决方案,只要它适用于gcc.
执行以下代码:
#include <iostream>
#include <type_traits>
struct s_ref {
int &foo;
};
struct s_ptr {
int *foo;
};
int main(int argc, char *argv[])
{
std::cout << "s_ref is_standard_layout:" << std::is_standard_layout<struct s_ref>::value << std::endl;
std::cout << "s_ptr is_standard_layout:" << std::is_standard_layout<struct s_ptr>::value << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
结果是:
s_ref is_standard_layout:0
s_ptr is_standard_layout:1
Run Code Online (Sandbox Code Playgroud)
基于标准布局的使用(即:"标准布局类型对于与其他编程语言编写的代码进行通信非常有用")这是有道理的,但我不确定哪个是违反的规则:
标准布局类是一个类(使用类,结构或联合定义):
没有虚函数,也没有虚基类.
对所有非静态数据成员具有相同的访问控制(private,protected,public).
要么在大多数派生类中没有非静态数据成员,要么最多只有一个具有非静态数据成员的基类,或者没有带有非静态数据成员的基类.
它的基类(如果有的话)本身也是一个标准布局类.
并且,没有与其第一个非静态数据成员相同类型的基类.
编辑:引用来自:http://www.cplusplus.com/reference/type_traits/is_standard_layout/,但http://en.cppreference.com/w/cpp/concept/StandardLayoutType也类似.
我试图为没有复制构造函数的类实现移动构造函数.我收到一个错误,该类的成员的默认构造函数丢失.
这是一个简单的例子来说明这一点:
struct A {
public:
A() = delete;
A(A const&) = delete;
A(A &&a) {}
};
struct B {
A a;
B() = delete;
B(B const&) = delete;
B(B &&b) {}
};
Run Code Online (Sandbox Code Playgroud)
试着编译这个,我得到:
move_without_default.cc: In constructor ‘B::B(B&&)’:
move_without_default.cc:15:11: error: use of deleted function ‘A::A()’
B(B &&b) {}
^
move_without_default.cc:6:2: note: declared here
A() = delete;
^
Run Code Online (Sandbox Code Playgroud)
为什么这是一个错误?有什么办法吗?
我正在尝试使用返回迭代器的函数构建一个特征.
我的简单示例如下所示:
pub trait TraitA {
fn things(&self) -> Iterator<Item=&u8>;
}
fn foo<A: TraitA>(a: &A) {
for x in a.things() { }
}
Run Code Online (Sandbox Code Playgroud)
哪个不起作用,因为在编译时不知道Iterator大小类型.
我正在使用 Cargo Features ( https://doc.rust-lang.org/cargo/reference/features.html ) 来指定条件编译选项。有没有办法为给定的 Cargo 配置文件启用一组这些功能(https://doc.rust-lang.org/cargo/reference/profiles.html)?
例如,像这样的东西(这似乎不起作用):
[features]
foo = []
[profile.test]
features = ["foo"]
Run Code Online (Sandbox Code Playgroud)
这样我就不必写,cargo test --features "foo"而只是写cargo test。
这是一个(有点人为的)例子来说明我想做什么
pub trait Node: Eq + Hash {
type Edge: Edge;
fn get_in_edges(&self) -> Vec<&Self::Edge>;
fn get_out_edges(&self) -> Vec<&Self::Edge>;
}
pub trait Edge {
type Node: Node;
fn get_src(&self) -> &Self::Node;
fn get_dst(&self) -> &Self::Node;
}
pub trait Graph {
type Node: Node;
type Edge: Edge;
fn get_nodes(&self) -> Vec<Self::Node>;
}
pub fn dfs<G: Graph>(root: &G::Node) {
let mut stack = VecDeque::new();
let mut visited = HashSet::new();
stack.push_front(root);
while let Some(n) = stack.pop_front() {
if visited.contains(n) {
continue
}
visited.insert(n); …Run Code Online (Sandbox Code Playgroud) 我使用的 vim 插件之一是:
syn keyword rustTodo contained TODO FIXME XXX NB NOTE
结果在NB评论中突出显示,这是我不喜欢的。有没有一种方法可以重新定义关键字或从中删除关键字?看着:help syn-keyword让我觉得这是不可能的。
我正在使用 Tokio,我想接收来自两个不同mpsc队列的请求。select!似乎是要走的路,但我不确定futures::select!和之间有什么区别tokio::select!。在哪种情况下,您应该使用一种而不是另一种?
rust ×5
c++ ×4
iterator ×2
asynchronous ×1
rust-cargo ×1
rust-tokio ×1
slice ×1
stl ×1
string ×1
traits ×1
vector ×1
vim ×1