我有一个带有两个变体的枚举。无论它包含一个参考Vec
的String
S或它包含了Vec
以引用的String
S:
enum Foo<'a> {
Owned(&'a Vec<String>),
Refs(Vec<&'a String>),
}
Run Code Online (Sandbox Code Playgroud)
我想遍历String
该枚举中对s的引用。
我尝试在上实现一个方法Foo
,但不知道如何使其返回正确的迭代器:
impl<'a> Foo<'a> {
fn get_items(&self) -> Iter<'a, String> {
match self {
Foo::Owned(v) => v.into_iter(),
Foo::Refs(v) => /* what to put here? */,
}
}
}
fn main() {
let test: Vec<String> = vec!["a".to_owned(), "b".to_owned()];
let foo = Foo::Owned(&test);
for item in foo.get_items() {
// item should be of type &String here
println!("{:?}", item);
}
}
Run Code Online (Sandbox Code Playgroud)
我有两个类,A和B,B从A派生.A有多个构造函数(下例中为2).B有一个额外的成员要初始化(它有一个默认的初始化程序).
我怎样才能实现B可以使用A的构造函数之一构造,而不必手动重写B中A的所有构造函数重载?
(在下面的例子中,我否则必须为B提供了四个构造函数:B():A(){}
,B(string s):A(s){}
,B(int b):A(),p(b){}
,B(string s, int b):A(s),p(b){}
,而不是只有两个,忽略的默认参数的可能性至少当).
我的方法是完美转发,但是,以下方案会导致错误:
#include <utility>
#include <string>
struct A {
A(const std::string& a) : name(a) {}
A(){}
virtual ~A(){}
std::string name;
};
struct B : public A {
template<typename... Args>
B(Args&&... args) : A(std::forward<Args>(args)...) {}
B(const std::string& a, int b) : A(a), p(b) {}
int p = 0;
};
int main()
{
B b1("foo");
B b2("foobar", 1);
}
Run Code Online (Sandbox Code Playgroud)
对于b2,海湾合作委员会抱怨no matching function for call to 'A::A(const …
我正在寻找一个管理任务分发(例如任务队列)的 python 库/框架。然而,任务需要专门的工人:工人 A 只能处理类型的任务a
,工人 B 和 C 只能处理类型b
等。此外,这些工人将在不同的计算机上运行并且不能共享相同的代码库(因为,就像在制造线上,每个任务都绑定到控制特定的硬件,只有一台计算机可以访问)。
我看过像 python RQ这样的库或 Celery,但如果我理解正确的话,它们需要相同的代码库才能在不同的工作人员上运行,并且用于分布式计算。我正在寻找的基本上只是抽象任务队列的管理和工作人员可以通过网络获取任务的机制。一项任务基本上只是一些关于它的进度、错误、结果等的数据和元信息。如果任务也可以相互依赖,那么一项任务可以依赖另一项任务的结果,这是一个奖励。
是否有一个简单的库,负责管理队列、网络协议等,提供我正在寻找的内容?
考虑我有一个函数make_numbers
应该创建一串随机数的情况,但我想在运行时(用户输入)决定应该使用哪种随机数生成器.为了使它更加困难,让我们假设make_numbers
函数对于要生成的数字类型是通用的.
我用伪代码编写了我想要实现的内容,并且我理解为什么这不起作用.但是,我不知道Rust的惯用方式是什么样的呢?
我天真的想法是:
Box<Rng>
,但由于Rng
具有通用功能,因此不起作用.StdRng
和XorShiftRng
,但我真的不能想到一个很好的方式来写这个.你能给我一些提示,看看这个特殊问题的解决方案是什么样的吗?
注意:这个问题不是关于具有不同类型的不同匹配臂(解决方案可能是Box
枚举,如上所述) - 而是如何在这种情况下应用这些解决方案.
extern crate rand;
use rand::{Rng, SeedableRng, StdRng};
use rand::prng::XorShiftRng;
use std::string::String;
use rand::distributions::{Distribution, Standard};
use std::fmt::Display;
// Generic function that should work with any type of random number generator
fn make_numbers<T, R: Rng>(rng: &mut R) -> String
where T: Display, Standard: Distribution<T>
{
let mut s = String::new();
for _i in 0..10 {
s.push_str(format!("_{}", rng.gen::<T>()).as_str());
}
s …
Run Code Online (Sandbox Code Playgroud) rust ×2
traits ×2
c++ ×1
c++11 ×1
constructor ×1
distributed ×1
iterator ×1
overloading ×1
python ×1
reference ×1
task-queue ×1