共175行

elixir-第一部分-入门

2026-03-17 11:35:55

让我们来看一个现实生活中的例子。

我曾专业参与过两个网络服务器的开发,这两个服务器有着相似的技术需求:

表1.1 两个实际Web服务器中使用的技术对比

技术要求 服务器A 服务器B
HTTP服务器 NGINX and Phusion Passenger Erlang
请求处理 Ruby on Rails Erlang
长时间运行的请求 Go Erlang
服务器级状态 Redis Erlang
可持久化数据 Redis and MongoDB Erlang
后台作业 cron, Bash scripts, and Ruby Erlang
服务崩溃恢复 Upstart Erlang

说明-服务器A

服务器B

注意

开发平台

Elixir 对比 Erlang 的代码简化示例

完整的 Erlang 求和服务器代码

-module(sum_server).
-behaviour(gen_server).

%% 对外暴露的 API
-export([start/0, sum/3]).

%% gen_server 回调函数(必须实现,即使不需要)
-export([init/1, handle_call/3, handle_cast/2, handle_info/2, 
         terminate/2, code_change/3]).

%% 启动服务器进程
start() -> 
    gen_server:start(?MODULE, [], []).

%% 调用求和方法
sum(Server, A, B) -> 
    gen_server:call(Server, {sum, A, B}).

%% 初始化回调(必须实现)
init(_Args) -> 
    {ok, undefined}.

%% 处理同步调用(核心求和逻辑)
handle_call({sum, A, B}, _From, State) -> 
    {reply, A + B, State}.

%% 以下是必须实现但本示例用不到的空回调
handle_cast(_Msg, State) -> 
    {noreply, State}.

handle_info(_Info, State) -> 
    {noreply, State}.

terminate(_Reason, _State) -> 
    ok.

code_change(_OldVsn, State, _Extra) -> 
    {ok, State}.

对应的 Elixir 实现

defmodule SumServer do
  # 使用 GenServer 行为,Elixir 自动处理回调默认实现
  use GenServer

  # 启动服务器进程(简化语法)
  def start do
    GenServer.start(__MODULE__, nil)
  end

  # 调用求和方法(语法糖简化调用)
  def sum(server, a, b) do
    GenServer.call(server, {:sum, a, b})
  end

  # 仅需实现核心回调,其余由 use GenServer 自动生成默认实现
  @impl true
  def handle_call({:sum, a, b}, _from, state) do
    {:reply, a + b, state}
  end
end

代码简化的核心体现

1. 减少样板代码:

2. 语法更简洁直观:

3. 调用简化:

Elixir 其他核心优势(补充原文)

除了代码简化,Elixir 相比 Erlang 还有这些关键提升:

1. 更丰富的语法特性:

2. 统一的工具链:

3. 更好的生态兼容与扩展:

总结