Elixir-List

本文介绍了Elixir中KeywordLists的数据结构,包括其语法、特点(原子键、可排序、重复键处理),并详细讲解了length、++/2、--/2、hd/tl、模式匹配和更新操作。重点展示了如何正确地访问和修改KeywordLists的元素。
摘要由CSDN通过智能技术生成

List

List的语法是: [ ],中括号里的值可以是任何类型
Elixir 里所有的数据结构都是 immutable 不可变的,对list进行任何操作都会返回一个新的list。
keyword lists 是一种关联数据结构,关联数据结构的意思就是一个key对应一个确定的值。在elixir中有2种关联数据结构,一种是keyword list一种是maps,我们今天线看keyword list。

  • keyword list的语法, [{:a, 1}, {:b, 2}] == [a: 1, b: 2],等式左右2种书写方式不能混写。
    iex(32)> [{:trim, true}]
    [trim: true]
    iex(33)> [{:trim, :a}]  # 当key为atom是,2个表达式相等[{:trim, :a}] = [trim: :a]
    [trim: :a]
    iex(34)> 
    
  • 获取keyword list的值
    iex(46)> list = [a: 1, b: 2]
    [a: 1, b: 2]
    iex(47)> list[a]  # 错误的获取方式
    ** (CompileError) iex:47: undefined function a/0 (there is no such import)
    
    iex(47)> list[:a] # 正确的获取方式
    1
    iex(48)>
    
  • keyword list中有重复的key,我们获取时候只能获取到list前面的
    iex(46)> list = [a: 1, b: 2]
    [a: 1, b: 2]
    iex(47)> list[:a]
    1
    iex(48)> new_list = [a: 0] ++ list
    [a: 0, a: 1, b: 2]
    iex(49)> new_list[:a]
    0
    iex(50)>
    
  • keyworl list 的三个特点:
    • key必须是atom
    • key可以排序
    • 同一个key在list中可以出现多次,赋值多次

Function

  • length/1 方法,返回list长度;
  • ++/2 and --/2
    iex(28)> [1, 2, 3, :a] ++ [:b, true]
    [1, 2, 3, :a, :b, true]
    iex(29)> [1, 2, 3, :a] ++ [:b, true, nil]
    [1, 2, 3, :a, :b, true, nil]
    
    iex(33)> length([1, 2, 3, :a] -- [1])                    
    3
    
  • hd/1 and tl/1: hd(head)获取list的第一个元素,tl(tail)获取list的除第一个元素外的其他元素;注意⚠️:如果获取[]空list的head和tail会返回错误
    iex(35)> list = [1, 2, 3, 4]
    [1, 2, 3, 4]
    iex(36)> hd list
    1
    iex(37)> tl list
    [2, 3, 4]
    
    iex(38)> hd([])
    ** (ArgumentError) errors were found at the given arguments:
    * 1st argument: not a nonempty list
    :erlang.hd([])
    iex(38)> 
    
  • 模式匹配,可通过 [head | tail] = [1, 2, 3],完成hd/1,tl/1的功能,[head | tail]还可以给list添加元素
    • [head | tail] 获取元素,[head | _] 使用_代替tail,忽略tail匹配
    iex(12)> list = [1, 2, 3]
    [1, 2, 3]
    iex(13)> [head | tail] = list
    [1, 2, 3]
    iex(14)> head
    1
    iex(15)> tail
    [2, 3]
    iex(16)> [head | _] = list
    [1, 2, 3]
    iex(17)> head
    1
    iex(18)> _
    ** (CompileError) iex:18: invalid use of _. "_" represents a value to be ignored in a pattern and cannot be used in expressions
    iex(18)> 
    
    • [head | tail] 完成list的数据更新
    iex(9)> list = [1, 2, 3]
    [1, 2, 3]
    iex(10)> [0 | list]
    [0, 1, 2, 3]
    iex(11)> list
    [1, 2, 3]
    iex(12)> hd [0 | list]
    0
    iex(13)> tl [0 | list]
    [1, 2, 3]
    iex(14)> 
    # list 作为head创建新的list
    iex(15)> [list | :a]  
    [[1, 2, 3] | :a]
    iex(16)> hd [list | :a]
    [1, 2, 3]
    iex(17)>  
    
  • 在某些特定的情况下,一组list的值会返回一个charlist(literally a list of characters); 当list全部为数字时,且list的元素为 ASCII 码时,Elixir将把list打印成charlist(一个被单引号打包的字符)。(!!此处的理解不是很到位)
    iex(65)> [108, 97, 110]                                   
    'lan'
    iex(66)> 
    
    注意⚠️'' 单引号表示数据格式为charlist,""双引号表示数据格式为string
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值