编程基础
数据类型
Elixir
提供了整数、浮点数、原子、列表、元组、字符串等数据类型,其基础的赋值方法如下
iex> 1 # 整数
iex> 0x1F # 整数
iex> 1.0 # 浮点数
iex> :atom # 原子/符号
iex> "elixir" # 字符串
iex> [1, 2, 3] # 列表
iex> {1, 2, 3} # 元组
和其他语言一样,elixir
支持不同进制的整数输入,0x, 0o, 0b
分别表示16进制、8进制以及二进制;而浮点型则同样支持科学计数法,例如 2.997 × 1 0 8 2.997\times10^8 2.997×108可写为2.997e8
。
原子是erlang/elixir
中特有的数据类型,在主流编程语言中相对比较少见,简单来说,就是直接以名字为变量。但与erlang
中通过大小写来区分原子的方式不同,elixir
中以:
开头则为原子。由于名字就是数据本身,同时名字又是编译器识别变量的优先方法,所以原子是一种常量。
字符串需要用双引号包含,此外,elixir
也支持更加灵活的字符串语法,即字符串中的#{}
会被识别为变量,并转化为字符串嵌套到外层的字符串中,例如
iex> "hellö #{:world}"
"hellö world"
函数
在elixir
中,函数名字必须以小写字母开头,并且只能在模块中定义。
用def
声明的函数,可以被模块外的程序所调用,而以defp
声明的函数,则只能在模块内部调用,其中p
可以理解为private
。下面举一个例子
defmodule Math do
def sum(a, b) do
sump(a, b)
end
defp sump(a, b) do
a + b
end
end
在elixir
中,函数的最后一行表达式即为其返回值,上面这个例子测试结果如下
>iex Math.ex
Interactive Elixir (1.14.4) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> Math.sum(1,2)
3
iex(2)> Math.sump(1,2)
** (UndefinedFunctionError) function Math.sump/2 is undefined or private. Did you mean:
* sum/2
Math.sump(1, 2)
iex:2: (file)
elixir
支持默认参数,例如将sum
函数改写为
def sum(a, b \\ 1) do
sump(a, b)
end
则在调用时效果如下
> Math.sum(1)
2
iex(2)> Math.sum(1,2)
3
匿名函数
elixir
支持匿名函数,并且可以在命令行中直接使用,其定义语法为fun .. -> .. end
,具体示例如下
> sum = fn a,b -> a+b end
#Function<41.3316493/2 in :erl_eval.expr/6>
> sum.(1,2)
3
通过is_function
可以检测函数是否存在,其输入参数为函数名和函数的参数个数,例如
> is_function(sum, 2)
true
> is_function(sum, 1)
false
在这个过程中,sum
函数作为一个参数传递给了另一个函数is_function
,这说明elixir
对函数式编程有着良好的支持。
判断语句
elixir
与erlang
最相似的地方就是没有循环语句,从而循环需要用递归来实现。但判断语句还是提供的,并且提供了if
和unless
两种,其中unless
可以理解为if not
。
下面做一个函数来测试一下unless
defmodule Test do
def ifTest(num) do
unless num < 5 do
"num >= 5"
else
"num < 5"
end
end
end
测试结果如下
iex(1)> Test.ifTest(3)
"num < 5"
iex(2)> Test.ifTest(7)
"num >= 5"