问题标签 [rust]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2277 浏览

io - 如何处理长时间运行的外部函数调用,例如 Rust 中的阻塞 I/O?

编者注:这个问题来自 Rust 1.0 之前的版本,使用了 Rust 1.0 代码中不存在的术语和函数。表达的概念仍然相关。

我需要通过 Rust 程序中的 POSIX 文件描述符读取外部进程提供的数据。文件描述符连接保持了很长时间(几小时),另一方不时将数据传递给我。我需要连续读取和处理数据流。

为此,我编写了一个循环调用libc::read()readv实际上)读取数据并在收到数据时对其进行处理。由于这会阻塞整个调度程序,我将在新调度程序 ( task::spawn_sched(SingleThreaded)) 上生成一个任务。只要它运行,它就可以正常工作,但我找不到干净地关闭循环的方法。

由于循环大部分时间都在阻塞,我不能使用端口/通道来通知循环退出。

我试图通过使用失败的链接任务将其取消来终止循环任务(生成受监督的循环任务,在其中生成一个链接任务并等待端口上的信号发生,然后再fail!()使用它来取消循环任务) . 它在测试中运行良好,但libc::read()不会中断(任务在读取完成之前不会失败,并且task::yield()有时会命中。

我从 libcore 源代码中学到了很多东西,但我似乎找不到合适的解决方案。

  1. 有没有办法杀死 Rust 中的(子)任务,即使它正在执行一些长的外部函数调用,比如阻塞读取?
  2. 有没有办法对 POSIX 文件描述符进行非阻塞读取,以便 Rust 保持对任务的控制?
  3. 我如何对信号做出反应,例如,SIGTERM如果用户终止我的程序?Rust中似乎还没有类似sigaction()的东西。
0 投票
1 回答
2165 浏览

optimization - Rust 优化循环?

我正在做一些非常简单的基准测试来比较 C 和 Rust 的性能。我使用了一个添加整数的函数1 + 2 + ... + n(我可以通过手动计算来验证),其中n = 10^10.

Rust 中的代码如下所示:

C代码如下:

我编译并运行它们:

然后我尝试使用优化标志,再次使用 C 和 Rust:

这些结果让我感到惊讶。我确实预计优化会产生一些效果,但优化后的 Rust 版本要快100000 倍:)。

我尝试更改n(唯一的限制是u64,运行时间仍然几乎为零),甚至尝试了不同的问题(1^5 + 2^5 + 3^5 + ... + n^5),结果相似:使用编译的可执行文件rustc -O比不使用标志快几个数量级,而且也是很多倍比使用gcc -O9.

所以我的问题是:发生了什么事?:) 我可以理解编译器优化1 + 2 + .. + n = (n*n + n)/2,但我无法想象任何编译器都可以为1^5 + 2^5 + 3^5 + .. + n^5. 另一方面,据我所知,结果必须以某种方式计算(而且似乎是正确的)。

哦,还有:

0 投票
1 回答
9712 浏览

rust - 可变结构字段

我知道在 0.6 中删除了可变字段。我收到此代码的以下错误,

C:\Users\mflamer\Dropbox\Rust\Tests\gmap.rs:23:8: 23:18 错误:分配给不可变字段 C:\Users\mflamer\Dropbox\Rust\Tests\gmap.rs:23 dart。 alpha = vec::from_elem(self.n + 1, dart);

我在这里做错了什么?谢谢。

0 投票
2 回答
4651 浏览

types - 为什么我需要写 let 来声明一个变量?

在 Haskell 中,我不需要写任何东西来声明一个变量。在 C++ 中我需要编写auto,据我所知,它的工作方式类似于 rust 的let.

  • let使用声明变量不是退一步吗?:

    /li>
  • 类型推断和赋值运算符应该足够了,或者不是吗?:

    /li>

我只是问,因为在浏览 Rust 的教程时首先引起我注意的是let' 无处不在。我觉得,我不应该需要打字!编译器已经知道我声明了一个变量!对于声明未初始化的变量,有人可能会争辩说用类型声明它们可能会很好。但同样,它是可选的,风格问题。编译器可以在第一次使用时推断出类型,如果不使用则不编译,因此无法推断出类型。

  • 强迫用户写 let的理由是什么?特别是,反对让 let 可选的理由是什么?
0 投票
1 回答
472 浏览

immutability - Rust“错误:移出不可变字段”

我创建了以下 Rust 结构:

和下面的代码来打印它:

尝试编译此代码,我收到以下错误:

这是什么意思?包含的行(*hdr).name, (*hdr).data)编译没有错误。该match声明不应该试图以hdr.next任何方式改变,所以我看不出不变性是如何进入它的。我试图编写一个不带指针的修改版本:

这个给了我:

请帮助我了解这里发生了什么!:)

0 投票
1 回答
816 浏览

graph - 图结构中的自有指针

在 rust 社区的慷慨帮助下,我设法获得了使用托管指针组装的拓扑数据结构的基础。这很好地结合在一起,总的来说,我对 Rust 感到非常兴奋。然后我读了这篇文章(这似乎是一个合理的计划),它启发了我回溯并尝试尽可能只使用拥有的指针重新组装它。

这是使用托管指针的工作版本:

在追逐生命周期错误几个小时后,我得出的结论是,由于循环性质(没有像我被警告的那样打结),拥有指针甚至可能无法做到这一点。我在这方面的微弱尝试如下。我的问题是,这种结构是否可以在不借助托管指针的情况下实现?如果不是,上面的代码是否被认为是合理的“生锈”?(惯用的锈)。谢谢。

0 投票
2 回答
18231 浏览

recursion - 是否可以在 Rust 中进行递归闭包?

这是一个非常简单的例子,但我将如何做类似的事情:

我知道这个特定示例可以通过迭代轻松完成,但我想知道是否可以在 Rust 中为更复杂的事情(例如遍历树)创建递归函数,或者我是否需要使用我自己的堆栈代替.

0 投票
1 回答
4008 浏览

enums - 用布尔值检查 Rust 枚举的类型?

我希望用户将命令行参数传递给我用 Rust 编写的一个简单函数。我知道我可以用它int::from_str(args[1])来转换,但这会返回一个Option<int>,这意味着为了将它传递给一个接受 的函数,int如下所示,我必须使用一个match语句。但是有n 个参数,就有 2^ n种可能性。用某些东西编写一系列嵌套match语句会很糟糕。如果有一种方法可以执行以下操作,那将是理想的:

有没有这样的方法?这让我可以测试除枚举之外的哪个成员match

0 投票
2 回答
1141 浏览

typeclass - Rust:使用特征/类型类来实现通用数值函数

我有一个函数可以制作一个整数链表:

但是,我想制作任何数字类型的范围,包括 uints、doubles 等。但是,例如,这不起作用:

产生:

如何在 rust 中创建一个通用函数,限制自己可以被“数字”类型调用?不用自己专门写接口?我曾假设有许多标准库特征(例如手册第 6.2.1.1 节中列出的那些,如eq,ord等,尽管现在我想知道这些是否是适当的“特征”)我可以声明泛型函数时使用?

0 投票
4 回答
4804 浏览

rust - Rust 中的组合运算符和管道正向运算符

Rust中是否同时存在组合和管道前向运算符(就像其他语言中一样)?如果是这样,它们看起来像什么,应该一个比另一个更喜欢?如果不存在,为什么不需要此运算符?