gpt4 book ai didi

Erlang:变量未绑定(bind)

转载 作者:行者123 更新时间:2023-12-04 17:43:38 31 4
gpt4 key购买 nike

为什么下面说变量未绑定(bind)?

9> {<<A:Length/binary, Rest/binary>>, Length} = {<<1,2,3,4,5>>, 3}.     
* 1: variable 'Length' is unbound

很明显 Length应该是3。

我正在尝试具有类似模式匹配的功能,即:
parse(<<Body:Length/binary, Rest/binary>>, Length) ->

但是如果以同样的原因失败。如何实现我想要的模式匹配?

我真正想要实现的是将传入的 tcp 流数据包解析为 LTV(长度,类型,值)。

在解析长度和类型之后的某个时刻,我只想准备到 Length字节数作为值,其余的可能用于下一个 LTV。

所以我的 parse_value功能是这样的:
parse_value(Value0, Left, Callback = {Module, Function},
{length, Length, type, Type, value, Value1}) when byte_size(Value0) >= Left ->
<<Value2:Left/binary, Rest/binary>> = Value0,
Module:Function({length, Length, type, Type, value, lists:reverse([Value2 | Value1])}),
if
Rest =:= <<>> ->
{?MODULE, parse, {}};
true ->
parse(Rest, Callback, {})
end;
parse_value(Value0, Left, _, {length, Length, type, Type, value, Value1}) ->
{?MODULE, parse_value, Left - byte_size(Value0), {length, Length, type, Type, value, [Value0 | Value1]}}.

如果我可以进行模式匹配,我可以将其分解为更令人赏心悦目的东西。

最佳答案

模式匹配的规则是,如果变量 X 出现在两个子模式中,如 {X, X} 或 {X, [X]} 或类似的,那么它们必须在两个位置具有相同的值,但每个子模式的匹配仍然在相同的输入环境中完成 - 来自一侧的绑定(bind)不会转移到另一侧。相等性检查在概念上是在之后完成的,就好像你在 {X, X2} 上匹配并添加了一个守卫 X =:= X2。这意味着元组中的 Length 字段不能用作二进制模式的输入,即使您将其设为最左边的元素也是如此。

但是,在二进制模式中,绑定(bind)在一个字段中的变量可以从左到右用于跟随它的其他字段。因此,以下工作(使用二进制中的前导 32 位大小字段):

1> <<Length:32, A:Length/binary, Rest/binary>> = <<0,0,0,3,1,2,3,4,5>>.
<<0,0,0,3,1,2,3,4,5>>
2> A.
<<1,2,3>>
3> Rest.
<<4,5>>

关于Erlang:变量未绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46260465/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com