如何在Erlang中使用方法等定义一些类(或类型)对象(如整数比较)?
例如,我怎样才能这样做:
qsort([Pivot|T]) ->
qsort([X || X <- T, X =< Pivot])
++ [Pivot] ++
qsort([X || X <- T, X > Pivot]).
Run Code Online (Sandbox Code Playgroud)
如果我想排序某些对象的列表,例如人.
I G*_*ERS 10
答案很快:你不想去那里.
答案越长:Erlang不是Java等"传统意义"中的面向对象语言.但它有几种机制可以作为对象的替身:首先有闭包可以很容易地编码对象的等价物,尽管编码是如此笨拙以至于几乎没有使用过.相反,人们倾向于"挑选"并从OO获得他们需要的具体想法,无论是封装,继承,多态等等.
其次是流程.进程是一个单独的封装实体,您可以向其发送消息并接收答案.它几乎与"一个类是一个单独的封装实体,您可以使用它来操作它的方法"相同.由于产生一个过程很便宜,因此将过程用作OO风格的对象并不是一个问题.
第三,有参数化模块,有些人喜欢使用这些模块,就好像它们将OO风格的代码带回语言一样.
第四,有一流的功能.由于您可以像数据一样轻松地传递函数,因此您通常可以使用它来概括代码而不是构建对象层次结构.
总结:如果你用惯用语来写Erlang,你很少会发现需要等同于'class'.
你不能(至少如果你想成为Erlang程序员,同时让Erlang代码正常工作).
Erlang是一种函数式编程语言,而不是面向对象的编程语言."对象"(具有附加功能的状态集合)的整个基本概念是功能方法(尽可能避开可变状态)的诅咒.你可以在功能语言中整合一个类似于对象的设置 - 特别是像Erlang这样的不纯粹的设置 - 但是生成的代码将难以阅读,难以维护,脆弱和丑陋.(难以阅读和维护,比使用OOP语言编写的OOP代码更加脆弱和丑陋,这似乎很难相信.)
您可以通过以下方式更好地满足您的需求:
用非OOP语言做一半的OOP通常是徒劳无益和痛苦的.