Elixir提供了String,使用上較為方便
來看下面的範例及說明:
iex(1)> "I am a string"
"I am a string"
很簡單的一個string
iex(2)> "Embedded expression: #{5+6}"
"Embedded expression: 11"
透過 #{}的方式,提供運算功能.
iex(3)> ~s(This is also a string)
"This is also a string"
使用 ~s 的方式,也能產生string
iex(4)> ~s("Do... or do not. There is no try." -Master Yoda)
"\"Do... or do not. There is no try.\" -Master Yoda"
使用 ~s 的方式,方便我們使用逸出序列.
iex(5)> 'XYZ'
'XYZ'
一個簡單的Character list
iex(6)> [88,89,90]
'XYZ'
與上面的方式相等.
iex(7)> 'Embedded expression: #{5+6}'
'Embedded expression: 11'
一樣透過 #{}的方式,提供運算功能.
iex(8)> ~c("Do... or do not. There is no try." -Master Yoda)
'"Do... or do not. There is no try." -Master Yoda'
使用 ~c 的方式,也能產生Character list
但是與上面string不同.Character list就是list.
兩者並不相同,不能直接互轉.需要透過函數轉換.
在Elixir若需要使用Erlang一些3rd party library時,
應該使用Character list,因為那些是使用Erlang開發的.
在前面的範例中,有看到Module裡的Function.在Elixir中
也可以使用function construct快速建立function
iex(1)> square = fn(x) ->
...(1)> x * x
...(1)> end
#Function<6.90072148/1 in :erl_eval.expr/5>
這樣就建立了一個名為square的函數.
iex(2)> square.(4)
16
這樣就可以引用及傳遞參數.
如同Erlnag,函數可以當作變數傳遞.
Elixir提供了一個很方便library Enum,來看看應用.
iex(3)> print_element = fn(x) -> IO.puts(x) end
#Function<6.90072148/1 in :erl_eval.expr/5>
iex(4)> Enum.each([1,2,3], print_element)
1
2
3
:ok
結合上面的square
iex(5)> print_square = fn(x) -> IO.puts(square.(x)) end
#Function<6.90072148/1 in :erl_eval.expr/5>
iex(6)> Enum.each([1,2,3], print_square)
1
4
9
:ok
Elixir 頗有Ruby之風,提供了一些語法糖(syntax sugar).
可以使用 & 快速建立函數.
iex(1)> lambda1 = fn(x, y, z) -> x + y + z end
#Function<18.90072148/3 in :erl_eval.expr/5>
iex(2)> lambda2 = &(&1 + &2 + &3)
#Function<18.90072148/3 in :erl_eval.expr/5>
iex(3)> lambda1.(1,2,3)
6
iex(4)> lambda2.(1,2,3)
6
兩者是等效的,而且可以觀察到,Elixir編譯器很聰明的,雖然是不同名稱,
其實都指向相同的函數內容.
接著講一下closure
在函數式程式語言中,closure是很自然與平常的.
來看一下範例
iex(1)> outside_var = 4
4
iex(2)> my_lambda = fn() ->
...(2)> IO.puts(outside_var * outside_var)
...(2)> end
#Function<20.90072148/0 in :erl_eval.expr/5>
iex(3)> my_lambda.()
16
:ok
讓outside_var重新繫結.
iex(4)> outside_var = 5
5
iex(5)> my_lambda.()
16
:ok
還是16,因為 my_lambda 繫結時,outside_var = 4.