命名函数

函数体是代码块

  代码块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.mzph.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