五年前,我写了一篇文章,讲述了我当时(现在仍然)最喜欢的脚本语言Ruby中我最讨厌的东西。
今天,我将对我目前最喜欢的编译语言Ruust做同样的事情。
就像最初的Ruby帖子一样,这些抱怨都是个人的,反映了我目前对该语言的最好理解。就像Ruby一样,它们都是出于对铁锈的热爱而写的。
在我的脑海中,我可以想到5种不同的方式1来表示字符串、字符串视图或接受字符串y的签名:
(我知道最后一个不是真正的字符串类型,但它经常出现在惯用的字符串处理代码中。)。
作为一名Rust新手,这些类型之间的区别令人非常困惑,并且使得理解引用变得更加困难(&;字符串为什么不同于&;str?为什么不能直接创建字符串呢?(见鬼的&;&;str从哪里来?)。
&;str to string:string::from()、to_string()、to_owner()、into(),不计数格式化路由或使用VEC或[U8]往返。
这些路线中的大多数在性能上都是相等的,而Rust社区似乎对哪些路线是“正确的”意见不一。
我最终养成了根据上下文使用不同的字符串的习惯(例如,into()表示我要将&;str转换为字符串,这样我就可以将其返回给_Owner(),表示我要取得所有权以便稍后使用该字符串)。
当前没有获取用户主目录的方法。std::env::home_dir()被明确标记为已弃用,文档鼓励用户依赖目录机箱(当前存档在GitHub上)2。
没有标准的扩展方式~。std::fs::canonicalize支持。而且..,但不是~。是的,我知道这是上面的复制品。
无法通过系统外壳调用命令。是的,我知道系统(3)是坏的。是的,我同意它不应该是执行其他进程的默认接口,甚至应该隔离以防止无意使用。所有这些都不能改变这样一个事实,即它偶尔是有用的3,并且在标准库中可以比最终开发人员随意使用sh-c更可靠地实现。
没有标准的打球方式。看起来球状板条箱是做这件事的半官方方式。
无可否认,这些都是很小的差距,而且都是由高质量的板条箱填补的。但它们增加了开发过程中的摩擦力,考虑到铁锈本来是如何无摩擦的,这种摩擦力尤其明显。
被告知我缺少Use std::IO::Read或Use Std::IO::Write,因为我正在调用他们的方法之一,该方法已被作用域中已有的内容实现。我理解Rust为什么这样做,但感觉很奇怪,特别是在未使用的导入的上下文中,否则就是编译器警告。
实现特征的特征的语法。为T:OtherTrai的特征实施T<;T&>不太糟糕,但它读起来几乎不像其他T:OtherTrait的Imp特征那么自然。
有时rustc需要我添加where self:size到我的静态(即非我)traitfunction。我仍然不明白为什么这有时是必需的,有时不是;我确信有一个像样的理由。
给定固定数组x=[T;N]和类型为U的索引变量i,使得U::MAX<;N,通过x[i]进行索引将始终是安全的。尽管如此,Rustc希望程序员明确地将I拓宽到USIZE:
fn main(){let lookup_table:[U8;256]=[0_u8;256];let index=5_u8;println!(";{}";,lookup_table[index]);}。
错误[E0277]:类型`[U8]`不能由`u8`索引-->;src/main.rs:4:20|4|println!(";{}";,lookup_table[index]);
这是可以理解的,但要求程序员要么在他们计划索引的任何地方使用as usize(冗长,并屏蔽索引背后的意图是U8),要么将索引本身设为usize(也屏蔽了意图,并使其更容易进行最终超出界限的算术)。
我不知道这是不是真正的虫子,但它咬了我几次,所以我要把它扔掉。
Cargo Install显然不知道如何发现带后缀的软件包版本。例如,如果将myfakepackage发布为版本0.0.1-alpha.0,则Cargo Install将报告:
我还有其他一些想要抱怨的事情(核心类型的别名不支持特征,包生态系统在风格上有点太js/npm-y),但我认为这样做可能会对一种我非常满意的语言过于负面。
五年后我仍然喜欢Ruby,我对Rust感到乐观。
不包括字符串和&;cstr,因为它们主要在外国投资环境中使用,可以理解它们是不同的。“↩。
我知道在POSIX平台上可靠地获取用户的主目录实际上非常困难。这并不能改变标准库应该尝试这样做的事实。“↩。
一个恰当的例子是:CLI经常公开钩点和回调,因为能够用外壳语法编写代码非常有用。。↩