什麼是一級函數? 下面的鏈接是知乎一篇問答給出的解釋, 原文連接:
https://www.zhihu.com/question/27460623/answer/36747015html
一級的(
first class
)
該等級類型的值能夠傳給子程序做爲參數,能夠從子程序裏返回,能夠賦給變量.大多數程序設計語言裏,整型,字符類型等簡單類型都是一級的.shell二級的(
second class
)
該等級類型的值能夠傳給子程序做爲參數,可是不能從子程序裏返回,也不能賦給變量.編程三級的(
third class
)
該等級類型的值連做爲參數傳遞也不行.網絡
有了這個基礎知識, 下面對於高階函數,閉包的理解就更容易了.閉包
Elixir不只容許你把函數放入變量, 還容許你把函數做爲參數傳遞給另外一個函數. 在數學中, 一個高階函數一般是一個接受一個或多個函數做爲輸入 或者
同時也返回一個函數做爲輸出的函數. 這個特性使Elixir語言很是強大.併發
iex> square = fn x -> x * x end #Function<6.17052888 in :erl_eval.expr/5> iex> Enum.map(1..10, square) [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
上面定義了一個匿名函數, 它接受一個數字, 求平方值並賦值給 square
變量. 而後使用 Enum.map
對數字列表 1..10
中的每個數字計算平方值.ide
注: 關於
1..10
請參考 Range. 函數高階函數參考資料:設計
http://chimera.labs.oreilly.com/books/1234000001642/ch08.htmlcode
Introducting Elixir 第八章
以及網絡中各類文檔資料, 請自行Google,百度
閉包有以下幾個特性:
能夠傳遞, 做爲參數或做爲返回值
它能記住當閉包函數建立時做用域中的全部變量
(至關於一個符號表快照), 在閉包函數外部調用此函數時, 閉包函數還可以訪問建立時做用於中的變量
.
iex(1)> outside_var = 5 iex(2)> print = fn() -> IO.puts(outside_var) end iex(3)> outside_var = 6 iex(4)> print.() 5
能夠看到, 即便修改了 outside_var
的值, 但結果任然是 5
.
正是因爲這個特性使Erlang
消除了併發編程中同一時刻
訪問全局變量的競太條件
, 這也是Erlang
做爲開發併發系統的首選語言之一.
看下面的例子:
iex> tuple = {:ok, "hello"} {:ok, "hello"} iex> put_elem(tuple, 1, "world") {:ok, "world"} iex> tuple {:ok, "hello"}
是的, 你仍可以給一個變量從新賦值.
defmodule Assignment do def change_me(string) do string = 2 end end
^
(Pin)操做符正常狀況下給變量綁定一個值(或者在其餘語言中成爲賦值)操做以下:
name = "developerworks"
這裏的name爲一個變量, "developworks"爲其值.
那麼關於 ^
, 一個更容易理解的方式, 能夠認爲是 ^name
是獲取 name
的值. 而且 ^
符號只能用在模式匹配中.