Erlang新手进阶笔记(4) - behaviour机制

本文介绍了Erlang中的Behaviour机制,这是一种确保模块遵循特定接口规范的方法。通过示例展示了如何定义并使用Behaviour来实现模块间的一致性和可调用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前的文章贴出来以后,没想到惊动了高手,呵呵。
[quote="mryufeng"]
behaviour就是用来作这个的。[/quote]
我是年初开始学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中接口一样,是一种编程契约
错误:软件包:rabbitmq-server-3.13.7-1.el8.noarch (rabbitmq_server) 需要:erlang >= 26.0 已安装: erlang-23.3.4.11-1.el7.x86_64 (@rabbitmq-erlang) erlang = 23.3.4.11-1.el7 可用: erlang-R16B-03.18.el7.x86_64 (epel) erlang = R16B-03.18.el7 可用: erlang-20.3.8.25-1.el7.x86_64 (rabbitmq-erlang) erlang = 20.3.8.25-1.el7 可用: erlang-20.3.8.26-1.el7.x86_64 (rabbitmq-erlang) erlang = 20.3.8.26-1.el7 可用: erlang-21.3.8.14-1.el7.x86_64 (rabbitmq-erlang) erlang = 21.3.8.14-1.el7 可用: erlang-21.3.8.15-1.el7.x86_64 (rabbitmq-erlang) erlang = 21.3.8.15-1.el7 可用: erlang-21.3.8.16-1.el7.x86_64 (rabbitmq-erlang) erlang = 21.3.8.16-1.el7 可用: erlang-21.3.8.18-1.el7.x86_64 (rabbitmq-erlang) erlang = 21.3.8.18-1.el7 可用: erlang-21.3.8.21-1.el7.x86_64 (rabbitmq-erlang) erlang = 21.3.8.21-1.el7 可用: erlang-22.2.7-1.el7.x86_64 (rabbitmq-erlang) erlang = 22.2.7-1.el7 可用: erlang-22.2.8-1.el7.x86_64 (rabbitmq-erlang) erlang = 22.2.8-1.el7 可用: erlang-22.3-1.el7.x86_64 (rabbitmq-erlang) erlang = 22.3-1.el7 可用: erlang-22.3.1-1.el7.x86_64 (rabbitmq-erlang) erlang = 22.3.1-1.el7 可用: erlang-22.3.2-1.el7.x86_64 (rabbitmq-erlang) erlang = 22.3.2-1.el7 可用: erlang-22.3.3-1.el7.x86_64 (rabbitmq-erlang) erlang = 22.3.3-1.el7 可用: erlang-22.3.4-1.el7.x86_64 (rabbitmq-erlang) erlang = 22.3.4-1.el7 可用: erlang-22.3.4.7-1.el7.x86_64 (rabbitmq-erlang) erlang = 22.3.4.7-1.el7 可用: erlang-22.3.4.10-1.el7.x86_64 (rabbitmq-erlang) erlang = 22.3.4.10-1.el7 可用: erlang-22.3.4.11-1.el7.x86_64 (rabbitmq-erlang) erlang = 22.3.4.11-1.el7 可用: erlang-22.3.4.12-1.el7.x86_64 (rabbitmq-erlang) erlang = 22.3.4.12-1.el7 可用: erlang-22.3.4.16-1.el7.x86_64 (rabbitmq-erlang) erlang = 22.3.4.16-1.el7 可用: erlang-22.3.4.19-1.el7.x86_64 (rabbitmq-erlang) erlang = 22.3.4.19-1.el7 可用: erlang-22.3.4.21-1.el7.x86_64 (rabbitmq-erlang) erlang = 22.3.4.21-1.el7 可用: erlang-23.1.2-1.el7.x86_64 (rabbitmq-erlang) erlang = 23.1.2-1.el7 可用: erlang-23.1.5-1.el7.x86_64 (rabbitmq-erlang) erlang = 23.1.5-1.el7 可用: erlang-23.2.1-1.el7.x86_64 (rabbitmq-erlang) erlang = 23.2.1-1.el7 可用: erlang-23.2.3-1.el7.x86_64 (rabbitmq-erlang) erlang = 23.2.3-1.el7 可用: erlang-23.2.4-1.el7.x86_64 (rabbitmq-erlang) erlang = 23.2.4-1.el7 可用: erlang-23.2.5-1.el7.x86_64 (rabbitmq-erlang) erlang = 23.2.5-1.el7 可用: erlang-23.2.6-1.el7.x86_64 (rabbitmq-erlang) erlang = 23.2.6-1.el7 可用: erlang-23.2.7-1.el7.x86_64 (rabbitmq-erlang) erlang = 23.2.7-1.el7 可用: erlang-23.2.7-2.el7.x86_64 (rabbitmq-erlang) erlang = 23.2.7-2.el7 可用: erlang-23.3-1.el7.x86_64 (rabbitmq-erlang) erlang = 23.3-1.el7 可用: erlang-23.3-2.el7.x86_64 (rabbitmq-erlang) erlang = 23.3-2.el7 可用: erlang-23.3.1-1.el7.x86_64 (rabbitmq-erlang) erlang = 23.3.1-1.el7 可用: erlang-23.3.2-1.el7.x86_64 (rabbitmq-erlang) erlang = 23.3.2-1.el7 可用: erlang-23.3.3-1.el7.x86_64 (rabbitmq-erlang) erlang = 23.3.3-1.el7 可用: erlang-23.3.4-1.el7.x86_64 (rabbitmq-erlang) erlang = 23.3.4-1.el7 可用: erlang-23.3.4.1-1.el7.x86_64 (rabbitmq-erlang) erlang = 23.3.4.1-1.el7 可用: erlang-23.3.4.3-1.el7.x86_64 (rabbitmq-erlang) erlang = 23.3.4.3-1.el7 可用: erlang-23.3.4.4-1.el7.x86_64 (rabbitmq-erlang) erlang = 23.3.4.4-1.el7 可用: erlang-23.3.4.5-1.el7.x86_64 (rabbitmq-erlang) erlang = 23.3.4.5-1.el7 可用: erlang-23.3.4.6-1.el7.x86_64 (rabbitmq-erlang) erlang = 23.3.4.6-1.el7 可用: erlang-23.3.4.7-1.el7.x86_64 (rabbitmq-erlang) erlang = 23.3.4.7-1.el7 可用: erlang-23.3.4.8-1.el7.x86_64 (rabbitmq-erlang) erlang = 23.3.4.8-1.el7 可用: erlang-23.3.4.10-1.el7.x86_64 (rabbitmq-erlang) erlang = 23.3.4.10-1.el7 您可以尝试添加 --skip-broken 选项来解决该问题 您可以尝试执行:rpm -Va --nofiles --nodigest
最新发布
07-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值