Erlang学习初探-1

本文介绍了Erlang中的基本单位——模块,讲解了模块的编译和运行过程,以及如何在模块中定义和导出函数。此外,还提到了Erlang中的三种符号:逗号、分号和句号的用途。最后,讨论了同名但参数不同的函数的使用和导出方式。

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

上次聊到了Erlang的基础知识,包括怎样安装和启动、原子、元素、元组、列表、模式匹配等,今天接着来看点新东西吧。

  • 先说说 模块(module)

模块(module)是Erlang中的基本单元,类似于Delphi中的单元文件,模块文件以.erl为扩展名,其中包含了我们编写的函数,运行模块钱需要编译,编译生成与模块同名但扩展名为.beam的文件。例如我们编写了名为double.erl的模块文件:

-module(double)
-export([dou/1]).

dou(X) -> X * 2.

接下来编译运行,在erlang的命令行输入:

Eshell V5.8.3  (abort with ^G)
1> c(double).
{ok,double}

2> double:dou(3).
6
3> 

以上就是编译运行的结果,是不是特别简单。

接下来简单解释一下:

-module(double).  %% 模块名为double,注意:保存的文件名需和模块名一致

-export([dou/1]).     %% 此模块中包含名为dou一个参数的函数,且此函数可在模块外部使用

至于函数体部分就不需要解释了吧。


c(module). 是编译的命令,表示将模块编译成名为module.beam的文件。
{ok,double} 表示编译成功,模块已经被编译并加载。

谈谈符号:

Erlang中会遇到这三种符号:

  1. 逗号 ","——分隔函数、模式中的参数以及数据构造器;
  2. 分号 ";"——分隔子句;
  3. 句号 "."——表示完整的函数或表达式.

  • 同名不同目的函数
可理解为使用不同参数的函数重载,所谓“目”,就是指参数。 在Erlang中,同名不同目的函数被视为不同函数。看看如下例子:

简单起见,看书上的吧:

sum(L)  -> sum(L, 0).

sum([], N) -> N;

sum([H | T], N) -> sum(T, H + N).

补充一下,如果你想在外部使用这个sum函数(一个和两个参数的),请像前面一样,加上:

-export([sum/1, sum/2]).

今天累了,间断一点,就到这里吧,晚安,各位(虽然可能count == 0).



                
错误:软件包: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
<think>我们正在解决RabbitMQ安装时遇到的Erlang版本依赖问题。根据引用[1][2][3]的信息,RabbitMQ需要特定版本的Erlang支持,而当前系统安装的Erlang版本(R16B-03.18.el7)过低(需要>=26.0)。以下提供两种解决方案:升级Erlang版本或使用Docker安装RabbitMQ。 ### 解决方案一:升级Erlang并安装RabbitMQ(推荐) #### 步骤1:卸载旧版Erlang ```bash sudo yum remove erlang* -y sudo yum autoremove -y ``` #### 步骤2:添加Erlang 26+仓库 由于系统是CentOS/RHEL 7,需添加RabbitMQ官方提供的Erlang仓库: ```bash # 导入仓库密钥 sudo rpm --import https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc # 创建仓库文件 cat <<EOF | sudo tee /etc/yum.repos.d/rabbitmq-erlang.repo [rabbitmq-erlang] name=rabbitmq-erlang baseurl=https://packagecloud.io/rabbitmq/erlang/el/7/\$basearch repo_gpgcheck=1 gpgcheck=1 enabled=1 gpgkey=https://packagecloud.io/rabbitmq/erlang/gpgkey sslverify=1 sslcacert=/etc/pki/tls/certs/ca-bundle.crt metadata_expire=300 EOF ``` #### 步骤3:安装Erlang 26+ ```bash sudo yum clean all sudo yum makecache sudo yum install erlang-26.0 -y ``` #### 步骤4:验证Erlang版本 ```bash erl -eval '{ok, Version} = file:read_file(filename:join([code:root_dir(), "releases", erlang:system_info(otp_release), "OTP_VERSION"])), io:fwrite(Version), halt().' -noshell ``` 输出应为`26.x`或更高版本。 #### 步骤5:安装RabbitMQ 3.13.7 ```bash # 添加RabbitMQ仓库 cat <<EOF | sudo tee /etc/yum.repos.d/rabbitmq.repo [rabbitmq-server] name=rabbitmq-server baseurl=https://packagecloud.io/rabbitmq/rabbitmq-server/el/7/\$basearch repo_gpgcheck=1 gpgcheck=1 enabled=1 gpgkey=https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey sslverify=1 sslcacert=/etc/pki/tls/certs/ca-bundle.crt metadata_expire=300 EOF # 安装RabbitMQ sudo yum install rabbitmq-server-3.13.7 -y ``` #### 步骤6:启动服务 ```bash sudo systemctl start rabbitmq-server sudo systemctl enable rabbitmq-server sudo rabbitmq-plugins enable rabbitmq_management ``` ### 解决方案二:使用Docker安装(快速规避依赖问题) 引用[4]提到,当系统版本(如CentOS 7)无法满足依赖时,可使用Docker安装: ```bash # 拉取RabbitMQ镜像(含管理插件) docker pull rabbitmq:3.13.7-management # 运行容器 docker run -d \ --name rabbitmq \ -p 5672:5672 \ -p 15672:15672 \ rabbitmq:3.13.7-management ``` 访问管理界面:`http://服务器IP:15672`(默认账号/密码:`guest`/`guest`)。 ### 注意事项 1. **版本兼容性**:RabbitMQ与Erlang版本必须严格匹配,具体对应关系参考[官方文档](https://www.rabbitmq.com/which-erlang.html)[^1]。 2. **强制安装风险**:引用[3]显示强制安装(`--nodeps`)会导致RabbitMQ无法运行,不推荐。 3. **环境清理**:若曾尝试错误安装,建议彻底卸载旧版: ```bash sudo yum remove rabbitmq-server -y sudo rm -rf /var/lib/rabbitmq/ ``` > **提示**:RabbitMQ 3.13.x需要Erlang 26+以支持新特性(如流式队列)[^1]。 §§相关问题§§ 1. 如何在ARM架构服务器上安装RabbitMQ? 2. 如何验证Erlang和RabbitMQ的版本兼容性? 3. 使用Docker部署RabbitMQ有哪些最佳实践? 4. 如何安全地升级生产环境的RabbitMQ版本? 5. RabbitMQ安装后如何进行基本安全配置?</think>### 解决 RabbitMQ 安装错误:需要 Erlang >= 26.0 根据您提供的错误信息和引用内容[^1][^3],RabbitMQ 3.13.7 需要 Erlang 26.0 或更高版本,而您的系统安装的是旧版 Erlang (R16B)。以下是完整解决方案: #### 方案一:安装匹配的 Erlang 版本(推荐) 1. **卸载旧版 Erlang** ```bash sudo yum remove erlang* -y sudo yum autoremove -y ``` 2. **添加 Erlang 26+ 仓库** ```bash # 导入仓库密钥 sudo rpm --import https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc # 添加仓库配置(CentOS/RHEL 7) cat <<EOF | sudo tee /etc/yum.repos.d/rabbitmq-erlang.repo [rabbitmq-erlang] name=rabbitmq-erlang baseurl=https://packagecloud.io/rabbitmq/erlang/el/7/\$basearch repo_gpgcheck=1 gpgcheck=1 enabled=1 gpgkey=https://packagecloud.io/rabbitmq/erlang/gpgkey sslverify=1 sslcacert=/etc/pki/tls/certs/ca-bundle.crt metadata_expire=300 EOF ``` 3. **安装 Erlang 26+** ```bash sudo yum clean all sudo yum makecache sudo yum install erlang-26.0 -y ``` 4. **验证安装** ```bash erl -eval '{ok, Version} = file:read_file(filename:join([code:root_dir(), "releases", erlang:system_info(otp_release), "OTP_VERSION"])), io:fwrite(Version), halt().' -noshell ``` 应输出 `26.x` 或更高版本 5. **安装 RabbitMQ** ```bash # 添加 RabbitMQ 仓库 cat <<EOF | sudo tee /etc/yum.repos.d/rabbitmq.repo [rabbitmq-server] name=rabbitmq-server baseurl=https://packagecloud.io/rabbitmq/rabbitmq-server/el/7/\$basearch repo_gpgcheck=1 gpgcheck=1 enabled=1 gpgkey=https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey sslverify=1 sslcacert=/etc/pki/tls/certs/ca-bundle.crt metadata_expire=300 EOF sudo yum install rabbitmq-server-3.13.7 -y ``` #### 方案二:使用 Docker 安装(快速绕过依赖问题) 引用[^4]建议使用 Docker 作为替代方案: ```bash # 拉取带管理插件的镜像 docker pull rabbitmq:3.13.7-management # 运行容器 docker run -d \ --name rabbitmq \ -p 5672:5672 \ -p 15672:15672 \ -e RABBITMQ_DEFAULT_USER=admin \ -e RABBITMQ_DEFAULT_PASS=secret \ rabbitmq:3.13.7-management ``` 访问管理界面:`http://服务器IP:15672`(使用 admin/secret 登录) #### 方案三:手动安装 Erlang RPM 如果仓库安装失败,可手动下载安装: 1. 从 [Erlang Solutions](https://www.erlang-solutions.com/downloads/) 下载 Erlang 26+ RPM 2. 安装: ```bash wget https://packages.erlang-solutions.com/erlang/rpm/centos/7/x86_64/esl-erlang_26.0.2-1~centos~7_amd64.rpm sudo yum install esl-erlang_26.0.2-1~centos~7_amd64.rpm -y ``` ### 关键注意事项 1. **版本兼容性**:RabbitMQ 和 Erlang 必须版本匹配,参考[官方兼容表](https://www.rabbitmq.com/which-erlang.html)[^1] 2. **避免强制安装**:引用[^3]显示 `--nodeps` 安装会导致 RabbitMQ 无法正常运行 3. **环境清理**:安装前彻底移除旧版本 ```bash sudo yum remove rabbitmq-server -y sudo rm -rf /var/lib/rabbitmq/ ``` > **提示**:RabbitMQ 3.13.x 需要 Erlang 26+ 以支持新特性如流式队列和增强的 Quorum 队列[^1]。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值