我目前正在尝试了解binary-size(number)
在Elixir中的运作方式。
在 The Little Elixir& amp; OTP指南有一节它们分解了一个128字节的ID3标签。标签具有以下属性:
他们在书中提取这个的方式是
<< "TAG", title :: binary-size(30), artist :: binary-size(30), album :: binary-size(30), year:: binary-size(4), _ :: binary >>
我无法理解每个值如何从binary-size(#num)
获得正确的值。也许这是模式匹配发生的顺序,我很难理解。目前我正在接近它,因为我们首先模式匹配三个字节的标头,因为它被硬编码为"TAG"
,此时我不确定如何从binary-size(30)
获取30个字节的值。此操作是否分为两个独立的部分?我们是说第一个从128,总字节大小,我们减去30然后将大小(30)的值赋给标题,然后将这个更新的大小带到二进制模式匹配中的每个值,传播任何变化吗?
答案 0 :(得分:13)
我认为你可能会对Elixir的模式匹配及其使用的语法感到困惑。
首先,我知道在语法的其他任何地方都没有看到它,但它id
不是binary-size(30)
。
基本上,它说二进制的大小是30(例如30个字节)而不是二进制减去30个字节。
例如:
binary - size(30)
所以这里我们说的是将head的值与字符串的第一个字节匹配&#34;二进制匹配字符串&#34;这意味着头部是iex(1)> string = "binary matching string"
"binary matching string"
iex(2)> <<head::binary-size(1), _rest::binary>> = string
"binary matching string"
iex(3)> head
"b"
。
b
以匹配二进制文件的其余部分,无论大小如何。
然而,我们并不限于严格匹配字节。由于_rest
在elixir中被称为位串,如果我们不使用<< >>
而只执行binary
,则传入的数字以位为单位进行测量,因此size
与val::binary-size(1)
(有点见下文)。
val::size(8)
为了更好地理解它,我肯定会建议打开IEX会话并输入iex(4)> <<head::size(8), _rest::binary>> = string
"binary matching string"
iex(5)> head
98
iex(6)> <<head>>
"b"
并阅读。