之前的文章贴出来以后,没想到惊动了高手,呵呵。
mryufeng 写道
behaviour就是用来作这个的。
我是年初开始学erlang的,抽时间学习,想通过这样一个系列,对自己的学习进行一点反馈。这个系列是面对刚会erlang语法的初学者的,我打算慢慢演化一些代码,由浅入深的说明erlang的不同之处。
言归正传,我们之前写的server已经比较通用了,但是erlang有更进一步的方案。
erlang不象java那样到处都是接口和实现类,它关注的是函数,也就是逻辑,当然,只要编程就要有规约,erlang的规约是通过"模板类"实现的,这个"模板类"的正式名称叫做behaviour。
一个典型的模板类大概就像这样——
% my_behaviour.erl %
-module(my_behaviour).
-export([bingo/1]).
-export([behaviour_info/1]).
behaviour_info(callbacks) -> [{somefunc,1}];
behaviour_info(_Other) -> undefined.
bingo(Mod) -> Mod:somefunc(ok).
我们使用这个模板类——
% my_server6.erl %
-module(my_server6).
-behaviour(my_behaviour).
Eshell V5.7.2 (abort with ^G)
1> c(my_behaviour), c(my_server6).
./my_server6.erl:3: Warning: undefined callback function somefunc/1 (behaviour 'my_behaviour')
{ok,my_server6}
显然,由于my_behaviour中通过behaviour_info申明了somefunc/1函数,所以my_server6就必须要实现这个函数了,修改一下看看——
Eshell V5.7.4 (abort with ^G)
1> c(my_behaviour), c(my_server6).
{ok,my_server6}
2> my_behaviour:bingo(my_server6).
ok
说起来并不神秘,behaviour仅仅是一个让编译器看的标记后,编译器会据此检查本模块是否已经具备要求实现的接口,否则会提示错误,这种方式非常简单的确保了系统的可靠性。
借助这个机制,我们只要保证使用了my_behaviour,模块就可以调用somefunc/1函数,它就像java中接口一样,是一种编程契约
接下来,我们使用behaviour机制改造之前的my_server5,把回调函数抽取出来由behaviour描述——
% my_server7.erl %
-module(my_server7).
-export([start/2,stop/1]).
-export([init/2]).
-export([request/2]).
-export([behaviour_info/1]).
behaviour_info(callbacks) -> [{init,1},{handle_request,2}];
behaviour_info(_Other) -> undefined.
......
相应的,handle2代码会变成这样:
% my_handle2.erl %
-module(my_handle2).
-behaviour(my_server7).
-export([init/1,handle_request/2]).
init(State) -> State.
handle_request(Request,State) ->
io:format("request to callback1: ~p~n",[Request]),
{"ok",State}.
执行方式类似
Eshell V5.7.2 (abort with ^G)
1> c(my_server7), c(my_handle2).
{ok,my_handle2}
2> C = my_client:start(),my_server7:start(my_handle2,"init").
<0.45.0>
3> my_server7:request(my_handle2, "hello by behaviour").
request to callback1: "hellby behaviour"
ok
4> my_server7:stop(my_handle2).
process stopped.last state is "init"
stop
分享到:
相关推荐
- 使用yum安装Erlang:`sudo yum install erlang-23.3.4.3-1.el7.x86_64.rpm` 2. **安装RabbitMQ**: - 下载RabbitMQ RPM包:`wget https://your_download_link/rabbitmq-server-3.8.17-1.el7.noarch.rpm` - ...
erlang-20.3.8.17-1.el7.centos.x86_64
erlang-sd_notify-1.0-2.el7.x86_64.rpm
erlang-xmerl-22.3-1.el7.x86_64.rpm,rabbitMQ安装需要依赖此环境。Erlang 是一种多用途编程语言,主要用于开发并发和分布式系统。它最初是一种专有的编程语言,Ericsson 使用它来开发电话和通信应用程序。
erlang-xmerl-23.0.2-2.el7.x86_64.rpm,rabbitMQ安装需要依赖此环境。Erlang 是一种多用途编程语言,主要用于开发并发和分布式系统。它最初是一种专有的编程语言,Ericsson 使用它来开发电话和通信应用程序。
erlang-21.3.8.11-1.el6.x86_64.rpm
erlang-19.3.6.4-1.el
安装rabbitmq时所需版本,三个资源已全部上传(这是其中一个,进我主页可以下其他两个),没有版本冲突,可以放心下载
https://blog.51cto.com/7794482/2436678 可根据文档进行部署,redis+mysql+mq的插件 rabbitmq 安装时需要该插件
erlang-21.3.7.1-1.el7.x86_64.rpm rabbitmq基础语言环境。
erlang-21.3.8.15-1.el7.x86_64.rpm
erlang-20.3.6-1.el7.centos.x86_64.rpm erlang-20.3.6-1.el7.centos.x86_64.rpm erlang-20.3.6-1.el7.centos.x86_64.rpm erlang-20.3.6-1.el7.centos.x86_64.rpm erlang-20.3.6-1.el7.centos.x86_64.rpm
对应rabbitmq 3.12.4,亲测可用
linux基于centos7.x,erlang21.3.8.16资源适配rabbitmq3.8.5。欢迎大家下载!!!!
erlang-23.2.7-1.el7.x86_64 .rpm
erlang-23.2.6-1.el7.x86_64
rabbitmq安装前需要安装erlang包,如果没有erlang包,rabbitmp则无法下载成功
esl-erlang_24.2.1-1_centos_7_amd64.rpm
由于不同版本的rabbitmq需要的erlang版本不一样,但是官网已经无法下载,此版本的erlang适用于rabbitmq3.7.4-3.7.8,其余版本自查是否可用
配套rabbitmq-server-3.8.17-1.el8.noarch.rpm