Rust 和Erlang的对比(2)

Erlang: Erlang有匿名函数,可以通过用fun和end关键字将代码块框起来声明。所有匿名函数都是使用当前上下文闭包,而且以在相同节点或其他连接节点上跨进程传递。匿名函数为Erlang分布式机制增加了极大的价值。 

Rust: Rust也支持使用匿名函数的闭包。这些还可以“捕获”环境,并可以在其他地方执行(在不同的方法或线程上下文中)。匿名函数可以存储在一个变量中,可以作为函数和跨线程的参数传递。

列表和元组

Erlang: 列表是动态的单向链表,可以将任何Erlang数据类型存储为元素。列表中的元素不能通过索引获得,而必须从头开始遍历(不像Rust中的数组)。元组是固定大小的,在运行时不能改变。它们可以是模式匹配的。 

Rust: 与Erlang中的列表类似,Rust有向量(vector)和数组。数组是固定大小的,如果在编译时元素的大小是已知的,就可以使用它。向量是内部链表(类似于Erlang中的列表)。当大小动态变化时使用向量,可以是普通的,也可以是双端的。普通向量是单向的,而双端向量是双向链表,可以在两端同时增长。Rust也有在运行时不能改变的元组。如果函数需要返回多个值,则可以使用元组。元组也可以是模式匹配的。

迭代器

Erlang: Erlang中的迭代器是与列表一起使用的。列表模块提供了各种各样的迭代机制,如map、filter、zip、drop等。除此之外,Erlang还支持列表推导,它使用生成器作为列表,并且可以根据谓词对列表中的每个元素执行操作。结果是另一个列表。 

Rust: 向量、双端向量和数组可以由迭代器来使用。在Rust中迭代器默认是懒惰的。除非在末尾有收集器,否则源不会被消耗。与传统的循环约束(如循环等)相比,迭代器提供了一种更自然的方式来使用任何列表数据类型,因为它们从来不会超出范围。

Record和Map

Erlang: Record是在编译时定义的固定大小的结构,而Map是动态的,它们的结构可以在运行时声明或修改。Map类似于其他语言中的hashmap,它们被用作键值存储。

Rust: Rust支持在编译时声明结构体。结构体不能在运行时修改,例如,不能添加或删除成员。由于Rust是一种低级语言,所以结构体可以存储引用。引用需要使用生命周期参数来防止悬空引用。Rust有一个标准的集合库,它支持许多其他的数据结构,比如Map、Set、序列等等。所有这些数据结构也可以惰性迭代。

String、Binary和Bitstring

Erlang: Erlang中的字符串只是在单向链表中存储每个字符的ASCII值的列表。因此,在字符串的开头追加字符总是比在它的末尾要容易。在Erlang中Binary很特殊,它们就像一个连续的字节数组,构成字节(8位序列)。Bitstring(位串)是Binary的特殊情况,它存储不同大小的位序列,例如三个1位序列、一个4位序列等。位串的长度不必是8的倍数。String、Binary和Bitstring支持更高级别的便利语法,使模式匹配更容易。因此,如果您正在进行网络编程,那么打包和解包一个网络协议包是很简单的。 

Rust: 在Rust中,有两类字符串。字符串字面值既不是存储在堆上,也不是存储在堆栈上,而是直接存储在可执行文件中。字符串字面值是不可变的。字符串可以有动态的大小。在这种情况下,它们存储在堆上,而其引用保存在堆栈上。如果在编译时字符串是已知的,则它们以文字形式存储,而在编译时未知的字符串则存储在堆中。这是一种有效的方法,可以在编译时识别内存分配策略,并在运行时应用它。

生命周期

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/97c0db980c0ffb0e8e85ab46f9cbb20f.html