Erlang是面向对象的吗?

时间:2010-08-07 18:17:34

标签: erlang oop

消息传递是Erlang的基本组成部分。 Alan Kay有argued,在他面向对象编程的观点中,消息传递是一个比对象更重要的概念(他“发明”了这个术语!)。

Erlang可以被认为是面向对象的编程语言(àlaSmalltalk)吗?

7 个答案:

答案 0 :(得分:33)

Joe Armstrong有gone on record说他认为Erlang“可能是唯一的面向对象的语言”(上下文中添加了“OO in Alan Kay意思”这个词) 。在同一次采访中,约翰逊指出了肖恩·科彭弗在他的回答中所说的相同的东西:在小的,二郎是一种纯粹的功能语言;在大型的过程中,它看起来就像凯式的面向对象。

答案 1 :(得分:16)

来自维基百科的引用,引自here

  

Benjamin Cuire Pierce和其他一些研究人员认为任何将OOP提炼到最小特征的尝试都是徒劳的。

但看着他们自己的徒劳尝试:

  • 动态调度 - 如果您将Erlang进程视为对象,那么是的,它是受支持的。
  • 封装 - 如果您将消息发送/响应视为方法调用,则支持它。
  • 子类型多态性 - 一种 - 如果你足够地扩展行为定义,则支持
  • 对象继承(或委托) - 没有任何正确性检查,你可以将一个对象替换为另一个 - 所以让我们说没关系
  • 打开递归 - 支持它(发送给自己的进程)

所以是的 - 有了一些烟雾和闪光,你可以尝试声称Erlang是面向对象的。但我可以使用相同的技巧将C表示为OO语言,因为您可以在其中使用OO样式并手动实现vtables。

任何看待Erlang的理智人士的回答都可能是“不”Erlang是一种功能性/消息传递导向的语言。

另一个答案可能是“为什么要分类”/“谁需要知道”?

答案 2 :(得分:6)

我认为在更高层次上,Erlang是面向对象的,因为你相信围绕这个术语讨论的原始概念。我的意思是隔离,消息传递,多态。

Erlang的进程可以保持状态,对该状态执行操作,并且它们与其他进程隔离,因为它们不能直接相互影响。由于任何进程都可以接收任何消息(并且消息可以很容易地委托给可以向原始发送者发送回复的另一个进程),我相信它也可以实现多态性。

当然,较低级别的Erlang会显示其功能方面,但我认为在更高级别(您在进程之间传递和协调消息的位置),Erlang会以面向对象的方式运行。你不能陷入困境,认为面向对象是关于类,继承和方法调用(与消息传递不同)。这只是在大多数主流语言中为我们提供范式的方式。

答案 3 :(得分:6)

Joe Armstrong在他的博客中发表了关于OO的帖子并回答了这个问题。

  

随着Erlang的流行,我们经常会被问到“Is Erlang OO” - 好吧   当然,真正的答案是“当然不是” - 但我们没有说   这大声 - 所以我们发明了一种巧妙的方式   回答那些旨在给人留下印象的问题   Erlang是(有点)OO(如果你挥手很多)但不是真的   (如果你听了我们实际说的话,并阅读小字   小心)。

顺便说一下,这篇文章是OO的一个非常有趣的批评者:http://harmful.cat-v.org/software/OO_programming/why_oo_sucks

答案 4 :(得分:2)

默认情况下不是。但它can be

答案 5 :(得分:1)

Erlang 的创建者 Joe Armstrong 有一个很好的报价:

面向对象语言的问题在于,它们具有随身携带的所有隐式环境。您想要香蕉,但是得到的是一只大猩猩,拿着香蕉和整个丛林。

答案 6 :(得分:-1)

您会将这段代码称为“面向对象”吗?

class <- c("bad","bad","bad","good","good","good","good","good","good","good","good")
val <- rnorm(length(class))
df <- data.frame(class, val)

# calculate number of bad rows required
n <- round(sum(df$class == "good") * (7/3)) - sum(df$class == "bad")

# create df of bad rows to sample from
bad.df <- df %>% filter(class == "bad")

# sample rows n times and create df of required size
s <- sample(1:3, n, replace = TRUE)
bad.df <- bad.df[s, ]

# bind to original df
df2 <- bind_rows(df, bad.df)
prop.table(table(df2$class))

此实现此“ Erlang类”时钟。

window.location.href = window.location.href;