Elixir 是由 José Valim 于 2011 年创建的函数式编程语言,运行在 Erlang VM(BEAM)上,继承了 Erlang 的并发性、容错性和分布式能力。Elixir 以 更现代的语法、更好的工具链和活跃的社区 著称。
Elixir 的核心定位是 高并发、高可用、分布式系统的构建语言。它提供了:
Elixir 由 José Valim(Ruby on Rails 核心团队成员)于 2011 年创建,目标是融合 Erlang VM 的强大并发能力和 Ruby 的开发者体验。
# 注释
# 变量(不可变)
name = "Elixir"
age = 10
# 字符串
IO.puts("Hello, #{name}!")
# 列表
list = [1, 2, 3, 4, 5]
# 元组
tuple = {:ok, "success", 200}
# 关键字列表(类似字典)
map = %{name: "Alice", age: 30}
# 访问 map
IO.puts(map.name)
IO.puts(map[:name])
# 条件判断
if age >= 18 do
IO.puts("Adult")
else
IO.puts("Minor")
end
# case 匹配
case tuple do
{:ok, message, _} -> IO.puts("Success: #{message}")
{:error, reason} -> IO.puts("Error: #{reason}")
_ -> IO.puts("Unknown")
end
# 定义函数
defmodule Greeter do
def hello(name) do
"Hello, #{name}!"
end
def hello(name, language) when language == "zh" do
"你好, #{name}!"
end
def hello(name, _language) do
"Hello, #{name}!"
end
end
# 调用
Greeter.hello("Elixir")
Greeter.hello("Elixir", "zh")
# 匿名函数
square = fn x -> x * x end
square.(5) # 25
# 管道操作符(数据处理)
[1, 2, 3, 4, 5]
|> Enum.filter(fn x -> rem(x, 2) == 0 end)
|> Enum.map(fn x -> x * x end)
|> Enum.sum()
# 结果: 4 + 16 = 20
# 更简洁的管道
[1, 2, 3, 4, 5]
|> Enum.filter(&(rem(&1, 2) == 0))
|> Enum.map(&(&1 * &1))
|> Enum.sum()
# 创建进程
spawn(fn -> IO.puts("Hello from process!") end)
# 消息传递
defmodule Messenger do
def loop do
receive do
{:greet, name} ->
IO.puts("Hello, #{name}!")
loop()
{:add, a, b, sender} ->
send(sender, {:result, a + b})
loop()
:stop ->
IO.puts("Stopping...")
end
end
end
# 启动进程
pid = spawn(Messenger, :loop, [])
# 发送消息
send(pid, {:greet, "Alice"})
send(pid, {:add, 10, 20, self()})
# 接收响应
receive do
{:result, value} ->
IO.puts("Result: #{value}")
end
send(pid, :stop)
# GenServer 示例
defmodule Counter do
use GenServer
# 启动
def start_link(initial_value) do
GenServer.start_link(__MODULE__, initial_value, name: __MODULE__)
end
# 回调
def init(initial_value) do
{:ok, initial_value}
end
# 同步调用
def get do
GenServer.call(__MODULE__, :get)
end
# 异步调用
def increment(amount) do
GenServer.cast(__MODULE__, {:increment, amount})
end
# 处理同步调用
def handle_call(:get, _from, state) do
{:reply, state, state}
end
# 处理异步调用
def handle_cast({:increment, amount}, state) do
{:noreply, state + amount}
end
end
# 使用
Counter.start_link(0)
Counter.increment(5)
Counter.increment(10)
Counter.get() # 15
# Phoenix 路由
defmodule MyAppWeb.Router do
use Phoenix.Router
get "/", PageController, :index
get "/users/:id", UserController, :show
post "/users", UserController, :create
# WebSocket 实时通信
socket "/socket", MyAppWeb.UserSocket
end
# Phoenix 控制器
defmodule MyAppWeb.PageController do
use MyAppWeb, :controller
def index(conn, _params) do
render(conn, "index.html", title: "Welcome!")
end
end
# Phoenix LiveView(实时视图)
defmodule MyAppWeb.CounterLive do
use Phoenix.LiveView
def mount(_params, _session, socket) do
{:ok, assign(socket, count: 0)}
end
def render(assigns) do
~H"""
Count: <%= @count %>
"""
end
def handle_event("increment", _params, socket) do
{:noreply, update(socket, :count, &(&1 + 1))}
end
end
# 定义宏
defmodule MyMacros do
defmacro unless(condition, do: block) do
quote do
if !unquote(condition) do
unquote(block)
end
end
end
end
# 使用宏
require MyMacros
MyMacros.unless false do
IO.puts("This will execute")
end
| 对比项 | Elixir | Go | Python |
|---|---|---|---|
| 范式 | 函数式 | 命令式 | 多范式 |
| 并发模型 | Actor | Goroutine | 线程/协程 |
| 容错性 | 极高 | 中 | 低 |
| 语法优雅 | 极好 | 简洁 | 简洁 |
| 学习曲线 | 陡峭 | 平缓 | 平缓 |
| 适用场景 | 高并发/实时 | 系统编程 | 通用开发 |
Elixir 语法、数据类型、函数、模式匹配
进程、消息传递、GenServer、OTP
Phoenix 框架、LiveView、宏、分布式
实时应用、WebSocket 服务、分布式系统
Elixir 是高并发系统的终极武器。
它用 函数式编程、Actor 模型、OTP 框架 提供了电信级的并发和容错能力。Elixir 是现代实时应用的最佳选择。
"Elixir 让高并发变得优雅而可靠。" ⚡