纯粹的功能编程是一个巧妙的技巧,可以展示你可以编码突变,但rust是一个甚至是聪明的技巧,可以显示你可以努力突变。
特定方面的I' D喜欢探索这里是:我们可以将TheObServation应用于I / O吗?
Haskell还有一个巧妙的技巧,可以在没有突变的情况下做一流的I / O.那么,我们可以在刚刚使用突变的生锈中拥有一流的I / O吗?
与Haskell一样,Rust中的一流I / O将意味着I / O WANDO的功能通过可以通过围绕程序传递的值作为参数ORRETURN值:
此处的文件是表示resourcethat支持I / O的一类值的示例。但与Haskell不同,而不是使用Monads,这里的文件是Justhas侧面实现的操作,如读写。
当然,Rust已经有很多类型的类型,包括在文章库中,具有类型的类型和TCPStream。并且很多RustCode已经遵循这种模式。严格地说,许多运作' t' t& mut参考文献,但这些类型概念上使用内部变形性,哪个是I / O独一无二的。
Haskell的剩余部分具有DRIRD NORN NOT#39; T在HASKELL中,所有I / O都是通过通过程序传递的值来完成的。随着I / O在其签名中所说的。在Rust中,当一个函数在其签名中的文件参数时,您知道它' s使用该文件进行I / O,但是一个' t有文件或任何其他I / O类型的函数可能会访问文件。
当然,Haskell的Monad也有许多其他用途。此博客帖子刚刚在功能签名中的I / O操作中,这对Howtwo否则造成的offorwode代码交互,以及一体的代码可以重定向另一码。
使用全局I / O的代码生锈示例是std :: io :: stdout。 AnyCode可以调用它并获取可以在周围功能中提到它的I / O可以执行I / O的STDOUT值' s签名。 STDOUT使用Abuiltin互斥锁,即使许多用例不需要那个,也是一个共同绩效的陷阱。勤奋的用户当然可以使用STDOUTLOCK在某些情况下擦除性能影响,但如果我们完全消除Builtin互斥锁怎么办?
如果STDOUT是一个程序将获得一次的价值,那么随后将传递给想要打印的所有功能?使用Rust'常用的拥有借款规则,它不需要一个互斥锁,因为许多用例。当然,用户必须在互斥锁或类似的情况下将其显式包装在互斥锁中,而是真正想要分享访问它,就像Rust中的任何其他东西一样。
IO-Streams Crate有一个实施。 StreamWriter :: STDOUT函数返回一个输出流,该流是不加工的输出流'标准输出。它实现了标准的写traitso它'它易于使用,它概念上拥有它的资源,所以它不会' tneed a buildin互斥锁。
在幕后,此功能实际上会获取STDOUTLOMEL以防止STD :: IO :: STDOUT使用与StreamWriter :: STDoutusage的混合混合,以维护其独家所有权假设。
作为另一个例子,任何代码都可以执行文件::打开(...)并将其传递一个字符串,以打开进程中的任何文件'文件系统命名空间,而不声明ITIN函数签名。
这意味着如果您想在outdingdirectory中运行它的代码,那么唯一的方法是创建一个新进程,其中包含一个newfileSystem命名空间。这是一种非常重的操作,无论是款项,也是在可携带性和复杂性方面的重要性。
一些码名有一个" root"通过Inthat的路径是相对于的,这有助于,但并不强制这种外径是相对于根的,或者那条路径不在猪外面的领先......
CAP-STD Crate具有DIR类型,它表示一个目录,它可以使文件系统访问函数的一流部分' s签名,并允许呼叫者为I / O指定不同的目录。而且,它还执行沙箱,确保相对于DIR内的DIRSTAY的路径。
文件系统有效地叠放别名变形状态,并且具有相对令人讨厌的同步原语。虽然CAP-STD并不是解决了可能出现的所有问题,它可以是帮助标准生锈成语的管理状态的一个工具。
(除了旁边,这种功能可能会恐慌溢出;在如下,我假设"纯和#34;允许恐慌。)
启用这种功能已经提出了几次,但是他们没有达到这种语言,部分原因是因为对这些特征的需求往往比其他语言更生锈。从优化器的角度来看,通常可以推断出这个伪装,至少在简单的情况下。
从程序员的角度来看,程序员不需要"纯"要知道无数是否突变,因为在Rust中,这些东西已经被可靠地在签名中。 &amp的存在或缺失;具有内部变形性的Mut Ortypes讲述了您需要了解的一切可能会发生突变。因此,大多数"纯"意味着冗余的信息已经存在:
///您是否可以猜测该功能突变? fn递增(x:& mut i32){//你'右转! * x + = 1; }
签名涵盖的东西是全球变形状态ANDI / O.全球变形状态在Rust中往往比其他语言不那么重要,因为Rust非常强烈地阻止全球变形状态。
然而,Rustn' T直立禁止全球变形状态,并不是' TREALLY劝阻全球I / O,即使在标准库中也存在。
所以而不是A"纯和#34;,禁止所有突变,更有趣的提议将是我' ll呼叫"显式"这意味着"没有全球性状态或I / O"当在没有&amp的函数上使用时使用签名中的Mut或Interior-Mutable类型,"显式"会和#34;纯",可以宣布为"纯"优化器。然而,"显式"可以在有变形论点的函数中使用,在那里它会表明那些是唯一突变的东西。
///所有突变和I / O都被占了! fn this_is_explic(f:&文件,x:& mut i32) - > IO ::结果<()> {writeln! (f,"你好世界")? ; * x + = 1;好的 (())}
"显式"财产还可以从能力为导向的安全视角表明缺乏环境权威。
添加一个"显式&#34是有意义的。关键字生锈然后?可能是不是这样的;它可能是rust中的大多数函数都会有资格"显式"所以将它添加为函数属性会增加很多杂乱。更有符合人体工程学的方法可能是为了提供一种方式声明AllTheir功能是显式的,具有选择单个函数的方法。
未来探索的可能方向是使用RustC驱动程序API创建一个可以为此识别语法形式的自定义静态分析工具,然后检查"显式"函数Don' Tachidentally呼叫"非显式"没有明确覆盖的功能,很多不安全。
一流的I / O指向一种思考软件的方式"机器"它'"过程" 它'在aren' t的焦点。 代替HOC惯例,用于协调对共享文件系统名称空间的访问或其他过程相关资源,使用First-Class I / O的代码可以通过ValutaRound来管理其I / O资源,类似于它已经使用其他示例资源的I / O资源。 一流的I / O可以是一个有用的概念来普遍应用,例如能力的安全性如何有助于启用共享无线链接。 它可以逐步应用,例如IO-Streams Crateor如何帮助CAP-STD箱子可以帮助各个程序的部分与每个托管齐地地合作。