Tag: 铁锈

在多个线程中独立运行Boehm GC

我正在试着写一些与Rust的Boehm GC 绑定 。 一些背景知识:Rust被devise成高并发语言,并且这种devise的结果是能够静态地限制GC指针到它们被分配的线程中(也就是说,在线程x中分配的GC指针可以永远不会被另一个线程保持活着(或者甚至被引用)。 因此,我希望推动Boehm尽可能地利用这个performance: 线程安全的,所以我可以从多个线程分配和收集 停止尽可能less的集合(即只是当前线程),其他线程可以继续运行,因为它们不可能干扰与自己之外的GC指针相关的任何事情 优选地,完全线程化地在不同线程的GC“实例”之间不同步 1很容易,但我找不到任何2和3的设施。最重要的部分是1和2,因为我希望能够在后台运行线程,而不pipe其他线程在做什么(即使他们都分配和垃圾收集千兆字节的内存)。 (我知道THREAD_LOCAL_ALLOC & gc_thread_local.h ,但是这并不完全满足3,它只是使它更有效率,但它仍然是有效的线程间传递线程分配的指针,而我不需要那保证。)

参考结构中的特征

我有一个特质Foo pub trait Foo { fn do_something(&self) -> f64; } 和一个引用该特征的结构 pub struct Bar { foo: Foo, } 试图编译我得到 error: reference to trait `Foo` where a type is expected; try `Box<Foo>` or `&Foo` 将结构更改为 struct Bar { foo: &Foo, } 告诉我error: missing lifetime specifier 将定义更改为 struct Bar { foo: Box<Foo>, } 编译 – 耶! 然而,当我想要一个函数返回foo […]

什么是types状态?

TypeState在语言devise方面提到什么? 我在一些讨论中看到了Mozilla提到的一个叫做Rust的新语言。

什么时候使用关联types与genericstypes是否合适?

在这个问题中 ,出现了一个问题,可以通过改变尝试将genericstypes参数用于关联types来解决。 这促使了 “为什么这里的关联types更合适? ,这让我想知道更多。 引入关联types的RFC说: 本RFC通过以下方式阐明特征匹配: 将所有特征types参数作为inputtypes进行处理 提供关联types,即输出types 。 RFC使用graphics结构作为激励的例子,这也在文档中使用 ,但是我承认并不完全理解关联types版本相对于types参数化版本的好处。 首要的是distance方法不需要关心Edgetypes。 这是很好的,但似乎有点关联types的原因有点浅。 我发现关联types在实践中非常直观,但是我发现自己在决定何时何地应该在自己的API中使用它们时感到困难。 在编写代码的时候,我应该什么时候select一个genericstypes参数的关联types,什么时候应该做相反的事情?

锈包与库和二进制?

我想制作一个Rust包,它包含一个可重用的库(大部分程序都是在这个库中实现的),还有一个使用它的可执行文件。 假设我没有混淆Rust模块系统中的任何语义,我的Cargo.toml文件应该是什么样的?

如何在Rust中匹配string文字?

我试图弄清楚如何匹配Rust中的一个string。 我最初尝试这样匹配,但我想通过Rust不能隐式地从std::string::String为&str 。 fn main() { let stringthing = String::from("c"); match stringthing { "a" => println!("0"), "b" => println!("1"), "c" => println!("2"), } } 然后我试图构造新的String对象,因为我找不到一个将String转换为&str的函数。 fn main() { let stringthing = String::from("c"); match stringthing { String::from("a") => println!("0"), String::from("b") => println!("1"), String::from("c") => println!("2"), } } 这给了我以下错误3次: error[E0164]: `String::from` does not name a tuple variant […]

Rust程序如何从其Cargo包中访问元数据?

如何从程序包中的Rust代码访问Cargo包的元数据(如版本)? 在我的情况下,我正在构build一个命令行工具,我想有一个标准的–version标志,我想实现从Cargo.toml读取包的版本,所以我不必保持在两个地方。 我可以想象还有其他的原因,有人可能想从程序中访问货物元数据。

为什么Rust可执行文件如此巨大?

刚刚find了Rust并阅读了文档的前两章,我发现他们定义语言的方法和方式特别有趣。 所以我决定让我的手指湿润,并开始与你好世界… 我在Windows 7 x64上这样做,顺便说一句。 fn main() { println!("Hello, world!"); } 发货cargo build ,看targets\debug的结果targets\debug我发现得到的.exe是3MB。 经过一些search(货物命令行标志的文档很难find…)我发现–release选项并创build了发布版本。 令我吃惊的是,.exe的大小只有很小的一点点变小了:2.99MB而不是3MB。 所以,承认我是Rust和它的生态系统的新手,我的期望是系统编程语言会产生一些紧凑的东西。 任何人都可以详细说明鲁斯特正在编译的内容,怎么可能从3class计划中产生如此巨大的图像呢? 它是编译到虚拟机? 有没有一个脱衣舞的命令我错过了(debugging发布版本内的信息?)? 还有什么可能让人明白是怎么回事?

通过可变的自引用方法拥有对象

下面是一个简单的模拟,其中一个场地是一个矩形区域,两个球在其中弹跳。 Field结构体有一个update方法,它调用每个球的update 。 在update方法中,球需要根据其速度移动。 但他们也需要相互作出反应,以及领域的界限: fn main() { let mut field = Field::new(Vector2d { x: 100, y: 100 }); field.update(); } #[derive(Copy, Clone)] struct Vector2d { x: i32, y: i32, } struct Ball { radius: i32, position: Vector2d, velocity: Vector2d, } impl Ball { fn new(radius: i32, position: Vector2d, velocity: Vector2d) -> Ball { Ball […]

派生特性会导致意外的编译器错误,但手动实现工作

这个代码( 操场 ): #[derive(Clone)] struct Foo<'a, T: 'a> { t: &'a T, } fn bar<'a, T>(foo: Foo<'a, T>) { foo.clone(); } …不编译: error: no method named `clone` found for type `Foo<'a, T>` in the current scope –> <anon>:7:9 |> 16 |> foo.clone(); |> ^^^^^ note: the method `clone` exists but the following trait bounds were […]