问题标签 [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.
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 源代码中学到了很多东西,但我似乎找不到合适的解决方案。
- 有没有办法杀死 Rust 中的(子)任务,即使它正在执行一些长的外部函数调用,比如阻塞读取?
- 有没有办法对 POSIX 文件描述符进行非阻塞读取,以便 Rust 保持对任务的控制?
- 我如何对信号做出反应,例如,
SIGTERM
如果用户终止我的程序?Rust中似乎还没有类似sigaction()
的东西。
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
. 另一方面,据我所知,结果必须以某种方式计算(而且似乎是正确的)。
哦,还有:
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);
我在这里做错了什么?谢谢。
types - 为什么我需要写 let 来声明一个变量?
在 Haskell 中,我不需要写任何东西来声明一个变量。在 C++ 中我需要编写auto
,据我所知,它的工作方式类似于 rust 的let
.
/li>let
使用声明变量不是退一步吗?:类型推断和赋值运算符应该足够了,或者不是吗?:
/li>
我只是问,因为在浏览 Rust 的教程时首先引起我注意的是let
' 无处不在。我觉得,我不应该需要打字!编译器已经知道我声明了一个变量!对于声明未初始化的变量,有人可能会争辩说用类型声明它们可能会很好。但同样,它是可选的,风格问题。编译器可以在第一次使用时推断出类型,如果不使用则不编译,因此无法推断出类型。
- 强迫用户写 let的理由是什么?特别是,反对让 let 可选的理由是什么?
immutability - Rust“错误:移出不可变字段”
我创建了以下 Rust 结构:
和下面的代码来打印它:
尝试编译此代码,我收到以下错误:
这是什么意思?包含的行(*hdr).name, (*hdr).data)
编译没有错误。该match
声明不应该试图以hdr.next
任何方式改变,所以我看不出不变性是如何进入它的。我试图编写一个不带指针的修改版本:
这个给了我:
请帮助我了解这里发生了什么!:)
graph - 图结构中的自有指针
在 rust 社区的慷慨帮助下,我设法获得了使用托管指针组装的拓扑数据结构的基础。这很好地结合在一起,总的来说,我对 Rust 感到非常兴奋。然后我读了这篇文章(这似乎是一个合理的计划),它启发了我回溯并尝试尽可能只使用拥有的指针重新组装它。
这是使用托管指针的工作版本:
在追逐生命周期错误几个小时后,我得出的结论是,由于循环性质(没有像我被警告的那样打结),拥有指针甚至可能无法做到这一点。我在这方面的微弱尝试如下。我的问题是,这种结构是否可以在不借助托管指针的情况下实现?如果不是,上面的代码是否被认为是合理的“生锈”?(惯用的锈)。谢谢。
recursion - 是否可以在 Rust 中进行递归闭包?
这是一个非常简单的例子,但我将如何做类似的事情:
我知道这个特定示例可以通过迭代轻松完成,但我想知道是否可以在 Rust 中为更复杂的事情(例如遍历树)创建递归函数,或者我是否需要使用我自己的堆栈代替.
enums - 用布尔值检查 Rust 枚举的类型?
我希望用户将命令行参数传递给我用 Rust 编写的一个简单函数。我知道我可以用它int::from_str(args[1])
来转换,但这会返回一个Option<int>
,这意味着为了将它传递给一个接受 的函数,int
如下所示,我必须使用一个match
语句。但是有n 个参数,就有 2^ n种可能性。用某些东西编写一系列嵌套match
语句会很糟糕。如果有一种方法可以执行以下操作,那将是理想的:
有没有这样的方法?这让我可以测试除枚举之外的哪个成员match
?
typeclass - Rust:使用特征/类型类来实现通用数值函数
我有一个函数可以制作一个整数链表:
但是,我想制作任何数字类型的范围,包括 uints、doubles 等。但是,例如,这不起作用:
产生:
如何在 rust 中创建一个通用函数,限制自己可以被“数字”类型调用?不用自己专门写接口?我曾假设有许多标准库特征(例如手册第 6.2.1.1 节中列出的那些,如eq
,ord
等,尽管现在我想知道这些是否是适当的“特征”)我可以声明泛型函数时使用?
rust - Rust 中的组合运算符和管道正向运算符
Rust中是否同时存在组合和管道前向运算符(就像其他语言中一样)?如果是这样,它们看起来像什么,应该一个比另一个更喜欢?如果不存在,为什么不需要此运算符?