我见过一些Rust示例中使用的关键字type,但我从来没有看到过它的解释。下面是我看过的一些使用它的例子:
impl Add<Foo> for Bar {
type Output = BarFoo;
// omitted
}
还有这个,
type T = HashMap<i32,String>; // Type arguments used in a type expression
let x = id::<i32>(10); // Type arguments used in a call expression
有人能解释一下
我有一个复杂的代码块,我在下面概述了一下。基本上我需要初始化一个泛型,它总是一个结构体,并且该结构体已经默认实现了,但是编译器还是会报错:
fn create<T: Default>() -> T
{
T { ..Default::default() }
}
fn main()
{
let mut x = create::<Bob>();
}
收益率:
error[E0574]: expected struct, variant or union type, found type parameter `T`
--> macro.rs:7
最近,当我遇到这个有趣的错误时,我正试图用不同的迭代样式对Rust循环进行基准测试。如果我使用下面的代码进行迭代,我将得到&[i32; 1000000] is not an iterator; maybe try calling .iter() or a similar method。我知道,我可以只使用iter(),,但是我正在试图找到哪个更快,iter()还是&array。
代码:
extern crate time;
fn main() {
let array: [i32; 1000000] = [0; 1000000]; // This will produc
我正在为外部C库编写包装器代码,并试图说服Rust编译器强制执行Rust代码本身没有反映的外部生命周期限制。例如,一种类型的“不透明句柄”可以返回子句柄,该子句柄仅在父句柄的生命周期内有效。
我尝试使用std::marker::PhantomData,但我无法说服编译器返回预期的错误。
换句话说,我希望下面的代码块不能被编译:
struct Parent;
struct Child; // Note that there is no reference to the parent struct
impl Parent {
fn get_child( &self ) ->
我试图从我的Rust程序中的一个进程中抽象出读写内存。以下是描述该问题的一些示例代码:
trait ProcessHandle {
// Create a new process handle from pid
fn new(pid: u32) -> Box<dyn ProcessHandle>;
// Read value from process of type T from the process
// (type T has an implicit Sized trait so we know how
// large the
x86和其他可能的体系结构提供了一种方法来获取single operation (DIV)中的商和余数。正因为如此,许多语言都具有DIVMOD组合操作(如DIVREM in C#、DIVMOD in Python或与div and div_t in C。我如何在Rust中做到这一点? 有没有一种优化的方法来同时执行这两种任务 let res = (a / b, a % b);
如何遍历泛型参数方法? 我有一个具有泛型方法的集合。 public void DoSomething<T>(List<T> input)
{
// I want to foreach
foreach (var v in input)
{
byte[] data = v.Data;
string name = v.Name;
}
} 我的问题是:我得不到V中的数据和名字。如何实现它?
我正在尝试编写一个函数,它从别人的框中接收对泛型结构的可变引用(因此我不能修改该结构的定义)。为结构实现的一些方法仅在结构满足特定边界时才可用: impl<'s, 'p: 's, P> TryCatch<'s, P>
where
Self: AsMut<HandleScope<'p, ()>>,
{
// functions that I want to use
} 我的函数可以正常工作,如果我这样声明它: fn my_func(try_catch: &mut v8::TryCatch
我觉得这是个简单的问题。我还在学习锈病,我想做以下几件事:
我希望创建一个异步特征(使用async-trait),它将实例化一个DB连接实例,并返回实现该特性的结构。
mongo.rs
#[async_trait]
pub trait DB {
async fn init<T, E>() -> Result<T, E>;
}
然后:favorites.rs (请参阅下面DB特性的实现)
use async_trait::async_trait;
use mongodb::Collection;
use rocket::form::FromForm;
use
fn main() {
let mut v = vec![1, 2, 3];
go(&mut v);
// still need v here, so I can't pass ownership to the "go' method above
println!("{}", v.len())
}
fn go(v: &mut Vec<i32>) {
for i in v {
println!("{}", i);
}
v.push(4)
锈蚀字符串实现和
但是为什么Rust正确地允许字符串被借用为&str,而不是&u8,即使我们提供了显式的类型注释提示?
let s = String::from("hello");
let item: &str = &s; // Works
let item2: &[u8] = &s; // Fails
当然,显式调用可以工作,但奇怪的是,为什么上面的调用不起作用?
let item2: &[u8] = s.as_ref();
我有以下几点
trait T {}
type Iter = fn() -> Iterator<Item = T>;
fn func(iter: Iter) {
for a in iter() {
// ...
}
}
我希望iter返回一个带有move语义的迭代器,所以我不应该返回&Iterator。问题是,Iterator是一种特征,所以它没有大小。上面的代码得到一个编译错误,指出Iterable不满足sized特征,因为所有局部变量都必须静态调整大小。
最重要的是,T也是一个特征,因此没有大小,所以我也不能将a绑定到它,因为它没有
public void run(){
setFont("Courier-24");
//Define list as ArrayList<Integer>
ArrayList<Integer> list = new ArrayList<Integer>();
readList(list);
}
private void readList(ArrayList list){
list.add("Hello");
list.add(2);
println("list