Rust教程,现在书中声称while true和之间存在差异loop,但在此阶段理解并不是非常重要.
如果你需要一个无限循环,你可能会想写这个:
Run Code Online (Sandbox Code Playgroud)while true {但是,Rust有一个专门的关键字loop来处理这种情况:
Run Code Online (Sandbox Code Playgroud)loop {Rust的控制流分析以不同的方式对待这个构造,因为我们知道它将始终循环.在这个阶段,这意味着什么并不是非常重要的细节,但总的来说,我们可以给编译器提供的信息越多,它对安全性和代码生成的影响就越大,所以你应该总是喜欢循环计划无限循环.
完成了一些编译器类型的工作后,我不得不想知道它有什么可能的语义差异,因为编译器弄清楚两者都是无限循环是微不足道的.
那么,编译器如何区别对待它们呢?
我听说货物有能力自动重新编译已更改的源文件,但我很难弄清楚如何告诉它这样做.
现在,我手动运行cargo build或cargo run每次要输入检查我的代码.我宁愿简单地保存文件并在邻近的终端窗口中查看结果.
如果你仍然不知道我在说什么,我正在寻找相当于sbt ~compile或等的货物sbt ~run.
这似乎很难找到,所以我开始怀疑它是否真的得到了支持.可能有人说货物可以检测到已更改的文件并重新编译它们的意思是货物可以检测到未更改的文件并避免重新编译它们,例如make.
总是设置RUST_BACKTRACE = 1是否合理?
它是否在正常执行期间(例如在函数调用期间)引入任何(重要的?)开销,或者在发生恐慌时是否只有开销?
我记得学习了一个数据结构,它将一组整数存储为树中的范围,但是已经有10年了,我记不起数据结构的名称,而且我对细节有点模糊.如果它有帮助,它是CMU教授的功能数据结构,我相信2002年的15-212(编程原理).
基本上,我想存储一组整数,其中大部分是连续的.我希望能够有效地查询集合成员资格,有效地添加一系列整数,并有效地删除一系列整数.特别是,我不小心保留原始范围是什么.如果相邻范围合并为一个更大的范围,则会更好.
一个简单的实现是简单地使用泛型集数据结构(如HashSet或TreeSet),并在添加范围时添加范围内的所有整数,或者在删除范围时删除范围中的所有整数.但是,当然,除了添加和删除速度之外,这会浪费大量内存.
我正在考虑一个纯粹的功能数据结构,但对于我目前的使用,我不需要它.IIRC,查找,插入和删除都是O(log N),其中N是集合中的范围数.
那么,你能告诉我我想要记住的数据结构的名称,还是一个合适的替代方案?
根据SBT文档,"通过声明类型为Project的惰性val来定义项目."
这当然是常态,而且正是我们正在做的事情,但我想知道如果有什么是它需要懒惰的原因.
使用常规val而不是lazy val 似乎工作.当然,使用严格的val会导致项目定义按顺序初始化,这意味着前向引用不起作用,需要按依赖顺序定义项目.
对于一个相对较大的构建,有53个相互依赖的项目,强制执行的命令实际上是一个Good Thing™,所以我想知道是否有使用延迟val的实际原因 - 除了允许定义以任意顺序发生.
似乎有一种普遍的概念,即Scala类型形成一个格子.
我可以在那里获得四分之三的路径,并通过定义top = ,bottom = 和meet = 来定义半格.那么≤至少大部分相当于,即子类型关系.AnyNothingwith<:
Scala甚至可以帮助我们测试至少一些晶格定律:
scala> implicitly[Nothing =:= Nothing]
res0: =:=[Nothing,Nothing] = <function1>
scala> implicitly[Nothing =:= String with Nothing]
res1: =:=[Nothing,String with Nothing] = <function1>
scala> implicitly[Nothing =:= String with Any]
<console>:11: error: Cannot prove that Nothing =:= String with Any.
implicitly[Nothing =:= String with Any]
^
scala> implicitly[Any =:= String with Any]
<console>:11: error: Cannot prove that Any =:= String with Any. …Run Code Online (Sandbox Code Playgroud) 这是我正在做的简化示例:
struct Foo ...
impl io::Read for Foo ...
fn problem<'a>() -> io::Result<&'a mut io::Read> {
// foo does not live long enough, because it gets allocated on the stack
let mut foo = Foo{ v: 42 };
Ok(&mut foo)
}
Run Code Online (Sandbox Code Playgroud)
Rust操场就在这里.
显然,问题是foo在堆栈上分配,所以如果我们返回对它的引用,引用会比对象更长.
在C中,您可以通过使用malloc在堆上分配对象来解决此问题,并且调用者需要知道free在适当时调用.在GCed语言中,这只会起作用,因为它foo会一直存在,直到没有引用它为止.Rust非常聪明,介于两者之间,所以我不确定我的选择是什么.
我认为一个选项是返回托管指针类型.是Box最合适的?(我找到了生锈指针的指南,但它已经过时了.)
我返回引用的原因是,实际上我需要返回实现的几个结构中的任何一个Read.我想另一种选择是创建一个枚举来包装每个可能的结构.这样可以避免堆分配,但似乎不必要的尴尬.
还有其他我没有想过的选择吗?
有没有办法只在我上次提取后没有改变的情况下推送到一个分支?
更具体地说,我想删除已经合并的分支,但前提是在我检查分支是否已合并和我推送删除之间没有其他人向它们推送新提交。
从git push文档中,我看到它确实支持一个--atomic选项,但该选项用于以原子方式相互更新多个分支,而不是确保我对远程分支的更新相对于其他用户是原子的更新。
即,我想删除远程 git 存储库上的合并分支,而不会删除任何其他人的工作,即使他们正在同时工作。