命名函數

函數體是代碼塊

  代碼塊do...end是一種表達式的組織方式。

# ./times.exs下
defmodule Times dodef doule(n) don
* 2end end

?

函數調用與模式匹配

  代碼如下:

# ./factorial.exs    計算階層
defmodule Factorial dodef of(0), do: 1          #終止條件要寫在上面,否則永遠都不會被執行到def of(n), do: n * of(n - 1)
end

?

哨兵子句

  代碼如下:

defmodule Guard dodef what_is(x) when is_number(x) doIO.puts "#{x} is a number"enddef what_is(x) when is_list(x) doIO.puts "#{x} is a list"enddef what_is(x) when is_atom(x) doIO.puts "#{x} is an atom"end
end

  它們由一個或多個when關鍵字緊接在函數定義后的斷言。當執行時,先執行基于參數的匹配,然后評估所有的when斷言。

  哨兵子句不支持||和&&

?

默認參數

  定義函數名時,可以用param \\ value 的語句給任意參數指定默認值。

# ./default_param.exs
defmodule Example dodef func(p1, p2 \\ 2, p3 \\ 3, p4) doIO.inspect [p1, p2, p3, p4]end
endExample.func("a", "b")        #=> ["a", 2, 3, "b"]
Example.func("a", "b", "c")    #=> ["a", "b", 3, "c"]   從從左到右匹配
Example.func("a", "b", "c", "d")

?

  有可能會出現以下錯誤:

def func(p1, p2 \\ 2, p3 \\ 3, p4)def func(p1, p2)    #傳入兩個參數時,第二個函數永遠無法被調用,報錯def func(p1, p2 \\ 123)  #傳入兩個參數時,也是如此
def func(p1, p2)

  可以添加一個包含默認參數,且只有函數頭部分沒有函數體的函數,而其余的使用普通函數,那些默認值就會被應用到對此函數的所有調用上

#省略部分內容
def func(p1, p2 \\ 123)def func(p1, p2) when ...def func(p1, p2) ...

?

|>管道運算符

  |>將左邊表達式的結果,將其作為第一個參數傳遞給右邊的函數調用

people = DB.find_customers
orders = Orders.for_customers(people)
tax = sales_tax(orders, 2013)
filing = prepare_filing(tax)
#可以寫為
filing = DB.find_customers|> Orders.for_customers|> sales_tax(2013)|> prepare_filingval |> f( a, b ) 等價于 f( val, a, b)

?

模塊

  模塊為定義的內容提供了命名空間。它可以用來封裝命名函數,還可以封裝宏、結構體、協議和其他模塊

?

模塊指令

  其作用域以指令出現處作為起點,直到當前模塊結束

  import,將模塊內的函數或宏引入到當前作用域。比如,如果從List模塊導入flatten函數,可以直接調用它而無需指定其模塊名。完整語法為:import Module [, only: | except ]

defmodule Example dodef func1 do    #將import寫到這里  fun2也能正常使用List.flatten [1, [2, 3], 4]enddef fun2 doimport List, only: [flatten: 1]flatten [5, [6, 7], 8]end
end

  alias,為模塊創建別名。目的為減少輸入

defmodule Example dodef func doalias Mix.Task.Doctest, as: Doctestdoc = Doctest.setupdoc.run(Doctest.defaults)end
end

  require,reqiire指令確保在代碼使用宏之前,加載定義這些宏的模塊。

?

模塊屬性?

  每個Elixir模塊都有與之關聯的元數據。元數據的每一項稱之為模塊的屬性,并且有自己的名字。在模塊內部我們可以在其名稱前加@訪問這些屬性,可以同此語法為屬性賦值:@name value,在函數內部不能設置屬性

defmodule Example do@author "Lr"def get_author od@authorend
end

  若多次為屬性賦值,在命名函數內部訪問該屬性,其值為定義函數時屬性的當前值。

?

模塊名Elixir

  在內部,模塊名僅僅是原子類型。比如,當我們寫IO時,Elixir內部將其轉化為原子類型Elixir.IO

is_atom IO        #true
to_string IO        #"Elixir.IO"
"Elixir.IO" === IO        #true"Elixir.IO".puts 123        #123    :ok

?

轉載于:https://www.cnblogs.com/lr1402585172/p/11493441.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/384211.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/384211.shtml
英文地址,請注明出處:http://en.pswp.cn/news/384211.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

STL運用的C++技術(6)——函數對象

http://blog.csdn.net/wuzhekai1985/article/details/6658940?_t_t_t0.20427969420870595 STL是C標準庫的重要組成部分之一,它不僅是一個可復用的組件庫,更是一個包含算法與數據結構的軟件框架,同時也是C泛型編程的很好例子。STL中運用了許多…

列表與遞歸

頭部和尾部 [head | tail ] [1] #head 1 tail [] [head | tail ] [1, 2, 3] #head 1 tail [2, 3] [head | tail ] [] #報錯 創建映射函數 我們可以使用一個函數來處理列表中的各個元素,如此可以接受更加復雜的處理,也可以…

優先隊列小結

不像棧和隊列,雖然STL有較好實現但是我們自己也可以很方便的實現,優先隊列自己實現起來就比較復雜,比較浪費時間(而且自己目前也不會233)而優先隊列因為其較好的特性經常被使用,因此對它的熟練掌握是做題的…

字典:散列表、散列字典、關鍵字列表、集合與結構體

字典 散列表和散列字典都實現了Dict的行為。Keyword模塊也基本實現了,不同之處在于它支持重復鍵。 Eunm.into可以將一種類型的收集映射轉化成另一種。 defmodule Sum dodef values(dict) dodict |> Dict.values |> Enum.sumend endhd [ one: 1, two: 2, thre…

C++11 學習筆記 lambda表達式

http://blog.csdn.net/fjzpdkf/article/details/50249287 lambda表達式是C11最重要也最常用的一個特性之一。lambda來源于函數式編程的概念,也是現代編程語言的一個特點。 一.函數式編程簡介 定義:簡單說,“函數式編程”是一種“編程范式”。…

Cutting Codeforces Round #493 (Div. 2)

Cutting There are a lot of things which could be cut — trees, paper, “the rope”. In this problem you are going to cut a sequence of integers. There is a sequence of integers, which contains the equal number of even and odd numbers. Given a limited bud…

Enum、Stream

Enum 其常見用法見&#xff1a;https://cloud.tencent.com/developer/section/1116852 在sort時&#xff0c;如果要獲得穩定的排序結果&#xff0c;要使用< 而不是 <。 Stream Stream是延遲處理的&#xff0c;而Enum是貪婪的&#xff0c;則意味著傳給它一個收集&#xff…

linux網絡編程之posix 線程(三):posix 匿名信號量與互斥鎖 示例生產者--消費者問題

http://blog.csdn.net/jnu_simba/article/details/9123603 一、posix 信號量 信號量的概念參見這里。前面也講過system v 信號量&#xff0c;現在來說說posix 信號量。 system v 信號量只能用于進程間同步&#xff0c;而posix 信號量除了可以進程間同步&#xff0c;還可以線程間…

洛谷P1080-國王游戲-貪心+高精度

P1080-國王游戲 啊啊啊&#xff0c;剛才已經寫了一次了&#xff0c;但是Edge瀏覽器不知道為什么卡住了&#xff0c;難受。 好吧&#xff0c;其實是一道可做題&#xff0c;分析得到的貪心策略就是就是將a * b小的放在前面&#xff08;其他的懶得說了&#xff09;&#xff0c;主要…

字符串與二進制

單引號字符串會被表示成整數值列表。 &#xff1f;c返回字符 c 的整數編碼。下面這個例子用于解析字符列表表示法&#xff0c;該表示法用于表示一個任意的有符號的十進制數據。 defmodule Parse dodef number([ ?- | tail ]) do_number_digits(tail, 0) * -1enddef number([ ?…

P1092蟲食算-深度優先搜索+玄學剪枝

P1092蟲食算 這道題的思想并不復雜&#xff0c;可是難點在于各種玄學剪枝。在仔細研究了題解大佬的剪枝原理后終于氵了過去。 先上代碼&#xff1a; #include<cstdio> #include<cstring> #include<algorithm> using namespace std;const int MAXN100; int n…

多進程

使用spawn創建一個新進程&#xff0c;其第一個參數是模塊名、第二個參數是函數名、第三個參數是參數列表。spawn會返回一個進程標識符&#xff0c;通常叫做PID。 defmodule Spawn1 dodef greet doreceive do{sender, msg} ->send sender, { :ok, "Hello #{msg}" }…

Linux socket編程(二) 服務器與客戶端的通信

http://www.cnblogs.com/-Lei/archive/2012/09/04/2670964.html上一篇寫了對套接字操作的封裝&#xff0c;這一節使用已封裝好的Socket類實現服務器與客戶端的通信&#xff08;Socket的定義見上篇Socket.h) 服務器端&#xff1a; ServerSocket.h #ifndef SERVERSOCKET_H #defin…

OTP服務器

defmodule Sequence.Server douse GenServerdef handle_call( :next_number, _from, current_number) do{ :reply, current_number, current_number 1}  #reply告訴OTP將第二個元素返回給客戶端end end use的效果將OTP GenServer的行為添加到當前模塊。這樣它就可以處理所有…

洛谷P1040-加分二叉樹-dp+二叉樹

P1040-加分二叉樹 這道題放在深度優先搜索的訓練題中&#xff0c;可是我實在沒有看出來應該怎么搜索。看了題解以后才看出來是一個很簡單的dp(我果然還是太菜了) 看出dp并且算出來最大的分數不是很復雜&#xff0c;關鍵是輸出給定中序遍歷序列的二叉樹的先序遍歷&#xff0c;要…

UNIX網絡編程:I/O復用技術(select、poll、epoll)

http://blog.csdn.net/dandelion_gong/article/details/51673085 Unix下可用的I/O模型一共有五種&#xff1a;阻塞I/O 、非阻塞I/O 、I/O復用 、信號驅動I/O 、異步I/O。此處我們主要介紹第三種I/O符復用。 I/O復用的功能&#xff1a;如果一個或多個I/O條件滿足&#xff08;輸…

解決iex -S mix報錯

執行iex -S mix命令的時候會遇到如下錯誤&#xff1a; 執行 mix deps.get 然后就可以運行 iex -S mix了 其中&#xff0c;有可能會出現 按照其網站下載相應文件&#xff0c;復制到項目根目錄下&#xff0c;然后執行命令&#xff08;mix local.rebar rebar ./rebar&#xff09;即…

貪心算法——選擇不相交區間問題

題目描述&#xff1a;設有n個活動的集合&#xff0c;其中每個活動都要求使用同一個資源&#xff0c;而在同一時間內只有一個活動能夠使用這一資源&#xff0c;每個活動i都有一個要求使用該資源的起始時間si和一個結束時間fi(si<fi)&#xff0c;如果選擇了活動i&#xff0c;則…

Anker—工作學習筆記

http://www.cnblogs.com/Anker/archive/2013/08/17/3263780.html 1、基本知識 epoll是在2.6內核中提出的&#xff0c;是之前的select和poll的增強版本。相對于select和poll來說&#xff0c;epoll更加靈活&#xff0c;沒有描述符限制。epoll使用一個文件描述符管理多個描述符&am…

Supervisor監控

可參考&#xff1a;https://www.cnblogs.com/wang_yb/archive/2016/06/08/5564459.html &#xff1a;https://segmentfault.com/a/1190000007379204 轉載于:https://www.cnblogs.com/lr1402585172/p/11551488.html