返回首页 - Notes - 2015

Elixir 学习笔记


与其他语言不同的地方

Elixir 的语法主要借鉴自 Ruby,但其与 Ruby 还是存在显著的差异,下面是基本的几个区别:

  1. Elixir 的方法不能在顶层单独定义,必须归属于某个指定的模块
  2. Elixir 定义带参数的方法时,方法名跟参数表列的括号间不能有空格(可以省略参数外围的括号)
  3. Elixir 定义方法需要带 do,而 Ruby 则不需要

下面是一个简单方法在两语言里面不同的写法,首先是 Ruby

def hello (name)
  puts "Hello #{name}"
end

hello 'Ruchee'

然后是 Elixir

defmodule Hello do
  def hello(name) do
    IO.puts "Hello, #{name}"
  end
end

Hello.hello 'Ruchee'

语言理念

数据赋值后不会再变更


基本语法

Elixir 的赋值操作实质是模式匹配,其中 _ 可以消耗一个不需要的匹配

不支持 +=-= 等运算符,其他语言里的 n += 1 只能老老实实写成 n = n + 1

++-- 自然也是没有的了(这两个 Ruby 也没有)

调用 Erlang 库,前面使用冒号即可,如调用数学库::math.pi

存储在变量中的函数,需要带句点才能调用,如:hello.("Ruchee")

函数最后的语句其执行结果自动成为函数的返回值,没有显式的 return 关键字(与 Ruby 类似,但 Rubyreturn 关键字)

Elixir 使用 <> 连接字符串(二进制数据),如:"my " <> "name is " <> "Ruchee"

使用 ++ 连接字符列表(列表),如:'my ' ++ 'name is ' ++ 'Ruchee'

可通过函数 List.to_stringString.to_char_list 在字符串和字符列表之间互转

Map 可以用类似 List 的语法来更新元素,但却不能用这种方式新增元素,如:%{name: "Ruchee", email: "my@ruchee.com" | email: "rucheecn@gmail.com"}


数据结构


匿名函数

defmodule Test do

  def calc(arg) do
    # 形式1
    ff = fn num -> :math.pi * num end
    ff.(arg)

    # 形式2
    ff = &(:math.pi * &1)
    ff.(arg)

    # 形式3
    (fn num -> :math.pi * num end).(arg)

    # 形式4
    (&(:math.pi * &1)).(arg)
  end

end


IO.puts Test.calc 10

常用工具

iex


date:2015-01-21、2015-01-22、2015-11-18、2015-11-20、2015-11-25、2015-11-26、2015-12-03