Oop 如何在Erlang中创建多个用户并在他们之间通信

Oop 如何在Erlang中创建多个用户并在他们之间通信,oop,erlang,Oop,Erlang,让我们看一看Java编程语言(作为一个例子),如果我想制作一个概念消息传递应用程序,它将类似于: class User { static List<User> users = new ArrayList(); String name; User(String name) { this.name = name; users.add(this); } void sendMessage(String message) {

让我们看一看Java编程语言(作为一个例子),如果我想制作一个概念消息传递应用程序,它将类似于:

class User {
    static List<User> users = new ArrayList();
    String name;

    User(String name) {
      this.name = name;
      users.add(this);
    }

    void sendMessage(String message) {
        for(User user : users) {
           user.messageReceived(message);
        }
    }

    void messageReceived(String message) { System.out.println(message); }

    String getName() { return name; } 
}
所有已创建的用户都将收到bob的消息

我正在尝试学习Erlang,并尝试重新创建类似的应用程序。我希望能够让不同的用户相互交流

我尝试过很多事情,比如:

-module(test).
-export([sendMessage/1]).

sendMessage(M) -> 
    io:format(M, []).
这样做只是将一条消息打印到控制台。如何拥有多个用户

有没有一个模式或什么可以做到这一点

谢谢您的时间:)

要模拟流程之间的通信,例如:-

c(chat).
Bob = chat:new("Bob").
John = chat:new("John").
Anne = chat:new("Anne").
chat:send(Bob, John, "Hello World!!").
要模拟流程之间的通信,例如:-

c(chat).
Bob = chat:new("Bob").
John = chat:new("John").
Anne = chat:new("Anne").
chat:send(Bob, John, "Hello World!!").

在找到正确的切入点之前,从erlang开始并不容易,因此,尽管我认为您的问题与主题无关,但我将尝试给您提供一些信息和评论

首先我建议您访问该站点,它确实是一个很好的资源,可以从erlang和函数式编程开始,采用真正的逐步方法。我认为这项投资非常有价值,至少对我来说是这样

下一步我已经对您的代码进行了注释,并考虑了对于erlang实现应该做的更改

class User {
Erlang中没有类概念,也没有对象。基本元素是一个进程(一个轻量级进程,完全独立于底层操作系统进程)。每个进程都有一个生命周期,在其生命周期内,它能够保持一个状态。 此状态可以是任何erlang项,并且在进程结束后它将立即丢失

static List<User> users = new ArrayList();
流程能够维护信息。流程的基本结构是

  • 一个启动函数,负责生成进程
  • 负责初始化进程状态的init函数
  • 以及一个循环,该循环主要包含一个接收块,该接收块分析传入消息,根据接收到的消息调用一些帮助函数,并通过使用更新状态调用自身进行递归循环

    用户(字符串名称){ this.name=名称; 用户。添加(此); }

构造函数由两个函数start和init替换。启动函数在OOP中没有真正的等价物,只是它依赖于系统为内部数据、消息队列、堆栈分配必要的内存。。。与java或C++中对象属性的自动内存分配相比较。然后在VM调度程序中注册该进程。init相当于用户定义的构造函数

void sendMessage(String message) {
    for(User user : users) {
       user.messageReceived(message);
    }
}
这样编写的sendMessage函数在执行时不依赖于它所属的对象实例,因为它只使用类的静态数据。因此,最接近的翻译可能是名称服务器的接口。接口通常是属于服务器模块(同一文件!)的一段代码,为其他模块导出,并在客户机进程上下文中执行。接口向服务器发送消息(其主要作用是隐藏与服务器的通信协议),如果访问是同步的(或不是),则等待响应(或不是)。在实际的通信应用程序中,请求应该来自用户,由系统中的一个进程表示,流看起来更像:

  • 用户使用外部接口(GUI程序、shell、web界面…)向其映像进程发送请求
  • 用户进程要求名称服务器提供所有必要的信息以到达收件人
  • 用户进程使用用户界面发送消息
也可以使用名称服务器直接发送消息

void messageReceived(String message) { System.out.println(message); }

String getName() { return name; }
最后两个功能是用户进程中的辅助功能,它们在接收消息时触发


最后,如果您感兴趣,我举了一个聊天系统的例子,它非常简单,说明了这里讨论的所有内容(以及更多内容),并包括文档和注释。

在找到正确的入口点之前,从erlang开始并不容易,因此,虽然我认为你的问题离题了,但我会尽量给你一些信息和评论

首先我建议您访问该站点,它确实是一个很好的资源,可以从erlang和函数式编程开始,采用真正的逐步方法。我认为这项投资非常有价值,至少对我来说是这样

下一步我已经对您的代码进行了注释,并考虑了对于erlang实现应该做的更改

class User {
Erlang中没有类概念,也没有对象。基本元素是一个进程(一个轻量级进程,完全独立于底层操作系统进程)。每个进程都有一个生命周期,在其生命周期内,它能够保持一个状态。 此状态可以是任何erlang项,并且在进程结束后它将立即丢失

static List<User> users = new ArrayList();
流程能够维护信息。流程的基本结构是

  • 一个启动函数,负责生成进程
  • 负责初始化进程状态的init函数
  • 以及一个循环,该循环主要包含一个接收块,该接收块分析传入消息,根据接收到的消息调用一些帮助函数,并通过使用更新状态调用自身进行递归循环

    用户(字符串名称){ this.name=名称; 用户。添加(此); }

构造函数由两个函数start和init替换。启动函数在OOP中没有真正的等价物,只是它依赖于系统为内部数据、消息队列、堆栈分配必要的内存。。。与java或C++中对象属性的自动内存分配相比较。然后在VM调度程序中注册该进程。