Elixir学习笔记(环境安装、基本类型)
Elixir,[ɪ'lɪksər],意为灵丹妙药、圣水,其logo是一枚紫色水滴
Elixir
Elixir创始人José Valim是ruby界的知名人士。 可以把Elixir看作函数式的ruby语言,或者是语法类似ruby的Erlang。
Elixir受瞩目的主要原因,是因为它较好地结合了Erlang编程语言的各种优点,
以及ruby那样简单易懂的语法(Erlang语法比较晦涩)。
Elixir还是一门初出茅庐的语言:
- 2014年9月1日临晨,1.0.0rc1发布
- 2014年9月7日晚,1.0.0rc2发布
- 2014年9月18日,v1.0正式发布
- 2015年9月28日,v1.1发布
- 2016年1月1日,v1.2发布
- 2016年6月2日,v1.3发布
Elixir 是一种动态的函数编程语言,用来编写可扩展和易于维护的应用。
函数式编程是种编程方式,它将电脑运算视为函数的计算。
Elixir 语言运行在Erlang虚拟机上的一门新语言,可以很方便地编写分布式、低延迟和高容错性的系统。
- 高并发
- 高容错性
- 函数式编程
- 可扩展
安装环境
mac上安装Elixir
我的电脑是mac,所以这里列出mac的安装过程。windows、linux、os的详细安装在官方文档有详细说明。
- 安装erlang
brew install erlang
- 安装elixir
brew install elixir
在控制台输入elixir -v可以查看当前安装的elixir版本(我这里安装的是最新版本1.6.1)
Erlang/OTP 20 [erts-9.2] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]
Elixir 1.6.1 (compiled with OTP 20)
安装好Elixir之后,你有了三个可执行文件:iex,elixir和elixirc。
如果你是用预编译包方式安装的,可以在解压后的bin目录下找到它们。
交互模式,类似于Ruby的irb,就是可以向其中输入任何Elixir表达式或命令,然后直接看到表达式或命令的结果。 控制台敲命令iex
会显示:
Erlang/OTP 20 [erts-9.2] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]
Interactive Elixir (1.6.1) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)>
如果你用的是Windows,你可以使用iex.bat来进入交互模式
永远的hello world
iex(1)> "hello world"
"hello world"
iex(2)> "hello
...(2)> world"
"hello\nworld"
iex(3)> "hello" <> " world"
"hello world"
当然,也可以把表达式写进脚本文件,用elixir命令执行它,如:
vim simple.exs #创建一个名字叫simple,以exs结尾的文件
IO.puts "hello word"
然后执行elixir simple.exs
就可以在控制台显示hello world了
基本类型
Elixir主要的基本类型有: 整型(integer),浮点(float),布尔(boolean),原子(atom,又称symbol符号),
字符串(string),列表(list)和元组(tuple)等。
iex> 1 # integer
iex> 0x1F # integer
iex> 1.0 # float
iex> true # boolean
iex> :atom # atom / symbol
iex> "elixir" # string
iex> [1, 2, 3] # list
iex> {1, 2, 3} # tuple
整数类型
iex(1)> 111
111
浮点类型
iex(2)> 3.14
3.14
布尔类型
Elixir使用true
和false
两个布尔值
iex(3)> true
true
iex(4)> false
false
Elixir提供了许多用以判断类型的函数,如is_boolean/1
函数可以用来检查参数是不是布尔型。
在Elixir中,函数通过名称和参数个数(又称元数,arity)来识别。 如
is_boolean/1
表示名为is_boolean
,接受一个参数的函数; 而is_boolean/2表示与其同名、但接受2个参数的不同函数。(只是打个比方,这样的is_boolean实际上不存在)
另外,<函数名>/<元数>
这样的表述是为了在讲述函数时方便,在实际程序中如果调用函数, 是不用注明/1
或/2
的。
iex(1)> is_boolean(true)
true
iex(2)> is_boolean(1)
false
类似的函数还有is_integer/1
,is_float/1
,is_number/1
, 分别测试参数是否是整型、浮点型或者两者其一。
原子
原子(atom)是一种常量,名字就是它的值。有些语言中称其为符号(symbol),比如ruby。
iex(3)> :hello
:hello
iex(4)> :hello == :hi
false
布尔值true
和false
实际上就是原子:
iex(5)> true == :true
true
iex(6)> is_atom(false)
true
字符串
在Elixir中,字符串以 双括号 包裹,采用UTF-8编码:
iex(5)> "hello world"
"hello world"
字符串支持换行符和转义字符
iex(6)> "hello
...(6)> world"
"hello\nworld"
你可以使用IO
模块(module)里的IO.puts/1
方法打印字符串:
iex(7)> IO.puts "hello\nworld"
hello
world
:ok
函数IO.puts/1
打印完字符串后,返回原子值:ok
。
我们可以使用专门的函数来返回字符串中的字符数量:
iex(8)> String.length("hello world")
11
String模块中提供了很多符合Unicode标准的函数来操作字符串。如:
iex(9)> String.upcase("hello")
"HELLO"
这里有一个注意的点,单引号和双引号包裹的字符串在Elixir中是两种不同的数据类型:
iex(10)> 'hello' == "hello"
false
(链式)列表
Elixir使用方括号标识列表。列表可以包含任意类型的值:
iex(12)> [1, 2, true, 3]
[1, 2, true, 3]
iex(13)> length [1, 2, 3]
3
两个列表可以使用++/2
拼接,使用--/2
做“减法”:
iex(15)> [1, 2, 3, true]
[1, 2, 3, true]
iex(16)> [1, 2, 3] ++ [4, 5, 6]
[1, 2, 3, 4, 5, 6]
iex(17)> [1, true, 2, false, 3, true] -- [true, false]
[1, 2, 3, true]
涉及列表头(head)和尾(tail)的概念。
列表的头指的是第一个元素,而尾指的是除了第一个元素以外,其它元素组成的列表。
它们分别可以用函数hd/1和tl/1从原列表中取出:
iex(18)> list = [1, 2, 3]
[1, 2, 3]
iex(19)> hd(list)
1
iex(20)> tl(list)
[2, 3]
尝试从一个空列表中取出头或尾将会报错:
iex(21)> hd []
** (ArgumentError) argument error
:erlang.hd([])
"Use the source, Luke!"
Elixir没有令人生畏的语法,融合了Ruby和Erlang优秀的特性。它不是Erlang也不是Ruby,它有自己创新的想法。