Erlang:使用方法和字段定义某类对象

Sta*_*tan 5 erlang

如何在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'.


JUS*_*ION 6

简短的回答

你不能(至少如果你想成为Erlang程序员,同时让Erlang代码正常工作).

答案很长

Erlang是一种函数式编程语言,而不是面向对象的编程语言."对象"(具有附加功能的状态集合)的整个基本概念是功能方法(尽可能避开可变状态)的诅咒.你可以在功能语言中整合一个类似于对象的设置 - 特别是像Erlang这样的不纯粹的设置 - 但是生成的代码将难以阅读,难以维护,脆弱和丑陋.(难以阅读和维护,比使用OOP语言编写的OOP代码更加脆弱和丑陋,这似乎很难相信.)

您可以通过以下方式更好地满足您的需求:

  • 学习自然习语和表达Erlang原生思想的方法(LYSE是这个首选解决方案的一个很好的起点); 要么
  • 使用面向对象的编程语言进行面向对象的编程.

用非OOP语言做一半的OOP通常是徒劳无益和痛苦的.