æä¾åºæ¬è¯æ³åæ¹æ³ç Elixir å¿«éåèå¤å¿åã
Elixir èªå¸¦äº iex è¿æ ·ä¸ä¸ªäº¤äº shellï¼å¯ä»¥éæ¶è®¡ç® Elixir 表达å¼çå¼ï¼è¿è¡iexå½ä»¤ï¼ç»§ç»è¾å
¥å 个ç®åç表达å¼è¯è¯ï¼
iex 2+3
5
iex 2+3 == 5
true
iex String.length("å¿«éççç¸è·³è¿äºææ°çç")
43
æ¯ä¸ªæä½ç³»ç»çææ¡£å¯ä»¥å¨å®ç½ç½ç«ä¸ Installing Elixir é¨åæ¾å°
IO.puts("Hello world from Elixir")
Elixir è¿è¡å½ä»¤
$ elixir hello.exs
Elixir æ¯æå¤ç§åºæ¬ç±»åï¼æ´æ°ãæµ®ç¹ãå¸å°å¼ãåååå符串ãå ¶ä»æ°æ®ç±»åï¼å¦å表åå ç»
# integer æ´æ°
iex> 1
# integerï¼æ¯æ2è¿å¶ã8è¿å¶å16è¿å¶çæ´æ°ï¼
iex> 0x1F
# float
iex> 1.0
# boolean
iex> true
# atom / symbol
iex> :atom
# string
iex> "elixir"
# list
iex> [1, 2, 3]
# tuple
iex> {1, 2, 3}
# è¿æ¯ä¸ä¸ªåè¡æ³¨é
iex> name = "Sean"
iex> "Hello #{name}"
"Hello Sean"
iex> "Hello " <> "world!"
"Hello world!"
x = 1
# => x ç°å¨çäº 1
{a, b} = {1, 2}
# => a çäº 1ï¼b çäº 2
å¨ Elixir ä¸ï¼ä½¿ç¨ = æ¥è¿è¡èµå¼æä½ï¼ä½å®é
䏿¯æ¨¡å¼å¹é
ãå·¦è¾¹æ¯æ¨¡å¼ï¼å³è¾¹æ¯å¼
:ok
å忝叏éï¼å®ä»¬çåç§°å°±æ¯å®ä»¬çå¼
list = [1, 2, 3]
tuple = {:ok, "value"}
defmodule MyModule do
def my_function(parameter) do
# 彿°ä½
end
end
add = fn a, b -> a + b end
if/else
if x > 0 do
"Positive"
else
"Non-positive"
end
case
case {1, 2} do
{1, x} -> "Matched #{x}"
_ -> "Not matched"
end
cond
cond do
x > 2 -> "Greater than 2"
x == 2 -> "Equal to 2"
true -> "Less than 2"
end
iex> 1 + 2
3
iex> 5 * 5
25
iex> 10 / 2
5.0
è¿ç®ç¬¦/æ»æ¯è¿åä¸ä¸ª floatãå¦æä½ æ³åæ´æ°é¤æ³æå¾å°é¤æ³ä½æ°ï¼ä½ å¯ä»¥è°ç¨ div å rem 彿°:
iex> div(10, 2)
5
å 许å¨è°ç¨éè¦ä¸ä¸ªæå¤ä¸ªåæ°ç彿°æ¶å 餿¬å·
iex> div 10, 2
5
iex> rem 10, 3
1
å¯ä»¥è°ç¨ round 彿°æ¥è·åä¸ç»å®æµ®ç¹æ°ææ¥è¿çæ´æ°ï¼æè è°ç¨ trunc 彿°æ¥è·åæµ®ç¹æ°çæ´æ°é¨å
iex> round(3.58)
4
iex> trunc(3.58)
3
å¯ä»¥ä½¿ç¨ is_integerãis_float æ is_number å嫿£æ¥åæ°æ¯å¦ä¸º integerãfloat æ number ç±»å
iex> is_integer(1)
true
iex> is_float(2.0)
true
iex> is_number(2.0)
false
Elixir æä¾äº ||ã&& å ! å¸å°æä½ç¬¦ï¼å®ä»¬æ¯æä»»ä½ç±»åçæä½ï¼
iex> -20 || true
-20
iex> false || 42
42
iex> 42 && true
true
iex> 42 && nil
nil
iex> !42
false
iex> !false
true
è¿æä¸ä¸ªæä½ç¬¦ï¼andãorãnotï¼ï¼å®ä»¬ç第ä¸ä¸ªåæ°å¿ é¡»æ¯å¸å°ç±»åï¼true å falseï¼:
iex> true and 42
42
iex> false or true
true
iex> not false
true
iex> 42 and true
** (ArgumentError) argument error: 42
iex> not 42
** (ArgumentError) argument error
import List, only: [duplicate: 2]
result = data
|> process1()
|> process2()
|> ç¨äºé¾å¼è°ç¨å½æ°ï¼å°åä¸ä¸ªå½æ°çç»æä½ä¸ºä¸ä¸ä¸ªå½æ°ç第ä¸ä¸ªåæ°
æ¯è¾è¿ç®ç¬¦ ï¼==, !=, ===, !==, <=, >=, < å >
iex> 1 > 2
false
iex> 1 != 2
true
iex> 2 == 2
true
iex> 2 <= 3
true
å表ï¼listï¼ãå ç»ï¼tupleï¼ãå ³é®åå表ï¼keyword listï¼ãæ å°ï¼mapï¼ã
iex> [3.14, :pie, "Apple"]
[3.14, :pie, "Apple"]
iex> list = [3.14, :pie, "Apple"]
iex> [3.14, :pie, "Apple"]
å表çå¼å¤´æ·»å å ç´
iex> ["Ï" | list]
["Ï", 3.14, :pie, "Apple"]
å表ç尾鍿·»å å ç´ /åè¡¨æ¼æ¥
iex> list ++ ["Cherry"]
[3.14, :pie, "Apple", "Cherry"]
è·åå表ç头é¨å ç´
iex> hd [3.14, :pie, "Apple"]
3.14
è·åå表çå°¾é¨å ç´
iex> tl [3.14, :pie, "Apple"]
[:pie, "Apple"]
iex> {3.14, :pie, "Apple"}
{3.14, :pie, "Apple"}
iex> [foo: "bar", hello: "world"]
[foo: "bar", hello: "world"]
iex> [{:foo, "bar"}, {:hello, "world"}]
[foo: "bar", hello: "world"]
å ³é®åå表é常éè¦ï¼å®æä»¥ä¸çç¹æ§ï¼
å 为è¿äºåå ï¼å¸¸è§çç¨æ³æ¯ä½ä¸ºåæ°ä¼ éç»å½æ°
Elixir çæ å°ï¼mapsï¼æ¯é®å¼å¯¹ç»æç第ä¸éæ©ï¼åå ³é®åå表ï¼keywordsï¼ä¸åï¼æ å°å 许任æç±»åçæ°æ®ä½ä¸ºé®ï¼è䏿°æ®å¹¶ä¸ä¸¥æ ¼æåºã ä½ å¯ä»¥ä½¿ç¨ %{} æ¥å®ä¹æ å°ï¼
iex> map = %{:foo => "bar", "hello" => :world}
%{:foo => "bar", "hello" => :world}
iex> map[:foo]
"bar"
iex> map["hello"]
:world
模å¼å¹é æ¯ Elixir å¾å¼ºå¤§çç¹æ§ï¼å®å 许æä»¬å¹é ç®åå¼ãæ°æ®ç»æãçè³å½æ°ã
iex> {a, b, c} = {:hello, "world", 42}
{:hello, "world", 42}
iex> a
:hello
iex> b
"world"
iex> [a, b, c] = [1, 2, 3]
[1, 2, 3]
iex> a
1
iex> [head | tail] = [1, 2, 3]
[1, 2, 3]
iex> head
1
iex> tail
[2, 3]
pin æä½ç¬¦ï¼å°±æ¯ç¨å·²ç»ç»å®çå¼å»å¹é ï¼è䏿¯éæ°ç»å®ä¸ä¸ªæ°å¼ã
iex> {x, ^x} = {2, 1}
{2, 1}
iex> x
2
_ 忽ç¥å¹é
çå¼iex> [head | _] = [1, 2, 3]
[1, 2, 3]
iex> head
1
if condition do
# æ¡ä»¶æç«æ¶æ§è¡ç代ç
else
# æ¡ä»¶ä¸æç«æ¶æ§è¡ç代ç
end
case expression do
pattern1 -> # å¹é
pattern1 æ¶æ§è¡ç代ç
pattern2 -> # å¹é
pattern2 æ¶æ§è¡ç代ç
_ -> # å
¶ä»æ
嵿§è¡ç代ç
end
cond do
condition1 -> # æ¡ä»¶1æç«æ¶æ§è¡ç代ç
condition2 -> # æ¡ä»¶2æç«æ¶æ§è¡ç代ç
true -> # å¦ææ²¡æä»»ä½æ¡ä»¶æç«ï¼æ§è¡è¿éç代ç
end
unless condition do
# æ¡ä»¶ä¸ºåæ¶æ§è¡ç代ç
end
try do
# å¯è½ä¼å¼åå¼å¸¸ç代ç
rescue
pattern1 -> # å¹é
pattern1 çå¼å¸¸å¤ç代ç
pattern2 -> # å¹é
pattern2 çå¼å¸¸å¤ç代ç
_ -> # å
¶ä»å¼å¸¸å¤ç代ç
end
å 许å°ä¸ä¸ªå¼ä¸è®¸å¤æ¨¡å¼è¿è¡æ¯è¾ï¼ç´å°æ¾å°å¹é çæ¨¡å¼ï¼
iex> case {1, 2, 3} do
{4, 5, 6} ->
"This clause won't match"
{1, x, 3} ->
"该åå¥å°å¹é
å¹¶ç»å® x å°è¯¥åå¥ä¸ç 2"
_ ->
"This clause would match any value"
end
"该åå¥å°å¹é
å¹¶ç»å® x å°è¯¥åå¥ä¸ç 2"
è¿å¯ä»¥ä½¿ç¨whenæå®é¢å¤çæ¡ä»¶
iex> case {1, 2, 3} do
{1, x, 3} when x > 0 ->
"Will match"
_ ->
"妿䏿»¡è¶³ä¿æ¤æ¡ä»¶ï¼å°å¹é
"
end
"Will match"
彿们éè¦æ ¹æ®æ¡ä»¶è¿è¡å¹é
è䏿¯å¼æ¶ï¼ç±»ä¼¼äºå
¶ä»è¯è¨ç else if æ elsifï¼å¯ä»¥ä½¿ç¨ cond æ§å¶ç»æã
iex> cond do
2 + 2 == 5 ->
"This will not be true"
2 * 2 == 3 ->
"Nor this"
1 + 1 == 2 ->
"But this will"
end
"But this will"
妿ææçæ¡ä»¶é½è¿å nil æ falseï¼åä¼å¼åä¸ä¸ªé误ï¼CondClauseErrorï¼ãå æ¤ï¼éè¦æ·»å ä¸ä¸ª final æ¡ä»¶ï¼çäº trueï¼å®å°å§ç»å¹é
ï¼
iex> cond do
2 + 2 == 5 ->
"This is never true"
2 * 2 == 3 ->
"Nor this"
true ->
"è¿å§ç»ä¸ºçï¼çåäº elseï¼"
end
"è¿å§ç»ä¸ºçï¼çåäº elseï¼"
妿å¨ifãcaseå类似çæé ä¸å£°æææ´æ¹äºä»»ä½åéï¼å声æåæ´æ¹å°åªå¨æé ä¸å¯è§ã
iex> x = 1
1
if true do
x = x + 1
end
2
iex> x
1
å¦æè¦æ´æ¹å¼ï¼åå¿ é¡»ä»ifè¿åå¼ï¼
iex> x = 1
1
iex> x = if true do
x + 1
else
x
end
2
def function_name(param1, param2) do
# 彿°ä½
end
示ä¾ï¼
def sum(a, b) do
a + b
end
def fun_name(:atom) do
# å¯¹äº :atom çå¤ç
end
def fun_name("string") do
# å¯¹äº "string" çå¤ç
end
def fun_name(number) when is_integer(number) do
# å¯¹äºæ´æ°çå¤ç
end
示ä¾ï¼
def is_positive(number) when number > 0 do
true
end
def is_positive(_), do: false
module_name.function_name(arg1, arg2)
示ä¾ï¼
Enum.map([1, 2, 3], &(&1 * 2))
def function_name(parameter \\ é»è®¤å¼) do
# 彿°ä½
end
示ä¾ï¼
def greet(name \\ "World") do
"Hello, #{name}!"
end
def function_name(param1, param2 \\ []) do
# 彿°ä½
end
示ä¾ï¼
def sum(numbers) do
Enum.sum(numbers)
end
@doc """
è¿æ¯å½æ°çææ¡£ã
"""
示ä¾ï¼
@doc """
Adds two numbers together.
## 示ä¾
iex> MyModule.add(1, 2)
3
"""
def add(a, b) do
a + b
end
è¿äºæ¯ Elixir 彿°è¯æ³çåºæ¬è¦ç¹ï¼å¯ä»¥å¸®å©ä½ å¼å§ç¼å彿°ã
iex> sum = fn (a, b) -> a + b end
iex> sum.(2, 3)
5
å¯ä»¥ä½¿ç¨ & è¯æ³æ¥ç®åå¿å彿°çå®ä¹ï¼
iex> sum = &(&1 + &2)
iex> sum.(2, 3)
5
å¿å彿°å»å¼ç¨å¤é¨çåéï¼è¿é常被称为éå ã
iex> double = fn a -> add.(a, a) end
#Function<6.71889879/1 in :erl_eval.expr/5>
double.(2)
4
éå ä¸å®å«
iex> f = fn
x, y when x > 0 -> x + y
x, y -> x * y
end
iex> f.(1, 3)
4
iex> f.(-1, 3)
-3
å½å彿°æ¯éè¿ def å ³é®åå®ä¹å¨æä¸ªæ¨¡åä¸
defmodule Greeter do
def hello(name) do
"Hello, " <> name
end
end
iex> Greeter.hello("Sean")
"Hello, Sean"
ç®å为ä¸è¡ï¼
defmodule Greeter do
def hello(name), do: "Hello, " <> name
end
ç§æå½æ°
defmodule Greeter do
def hello(name), do: phrase <> name
# 使ç¨defpæ¥å®ä¹ç§æå½æ°
defp phrase, do: "Hello, "
end
彿°çé»è®¤åæ°ï¼ä½¿ç¨ \\ æ¥å®ä¹é»è®¤åæ°
defmodule Greeter do
def hello(name, language_code \\ "en") do
phrase(language_code) <> name
end
defp phrase("en"), do: "Hello, "
defp phrase("es"), do: "Hola, "
end
Elixir æä¾äº Enum å Stream 两个模åï¼ç¨äºå¤çéåã
Enum 模åæä¾äºå¯¹éåçå¸¸ç¨æä½ï¼å¦ mapãfilterãreduceãsortãchunkãjoinãinto çã
iex> Enum.map([1, 2, 3], fn x -> x * 2 end)
[2, 4, 6]
iex> Enum.map(%{1 => 2, 3 => 4}, fn {k, v} -> k * v end)
[2, 12]
ä½ä¸ºEnumçæ¿ä»£åï¼Elixiræä¾äºæ¯æææ°æä½çStream模å
iex> 1..100_000 |> Stream.map(&(&1 * 3)) |> Stream.filter(odd?) |> Enum.sum()
7500000000
æµæä»¶æä½
iex> stream = File.stream!("path/to/file")
%File.Stream{
line_or_bytes: :line,
modes: [:raw, :read_ahead, :binary],
path: "path/to/file",
raw: true
}
Enum.take(stream, 10)
# ä¸é¢çä¾åå°æåæéæä»¶çå10è¡ãè¿æå³çæµå¯¹äºå¤ç大åæä»¶çè³æ¯ç½ç»èµæºçæ
¢éèµæºé常æç¨ã