iT邦幫忙

DAY 25
1

蠻可愛的 Erlang 與 Elixir系列 第 25

Elixir 的 String,Character list與function construct

  • 分享至 

  • xImage
  •  

String

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 的方式,方便我們使用逸出序列.

Character list

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開發的.

function construct

在前面的範例中,有看到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.


上一篇
Elixir 的 List
下一篇
Elixir 的 range, keyword list
系列文
蠻可愛的 Erlang 與 Elixir30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言