Сопоставление аргументов двоичных битов
У меня проблема с сопоставлением переменного числа битов в двоичном файле, который я сузил до следующего примера игрушки, чтобы извлечь первые несколько битов двоичного файла:
f(<<H:Bits, _/binary>>, Bits) ->
H.
Компилятор (R15B01) говорит мне variable 'Bits' is unbound
, С другой стороны, это прекрасно работает:
f(X, Bits) ->
<<H:Bits, _/binary>> = X,
H.
И он делает то, что я ожидаю, например f(<<1,2,3,4>>, 8)
дает 1, и f(<<1,2,3,4>>, 16)
дает 258.
Почему не работает первая форма? Разве это не должно быть эквивалентно?
1 ответ
В вашем первом примере f(<<H:Bits, _/binary>>, Bits) -> H
переменная Bits ранее не привязывалась - она встречается как в первом, так и во втором шаблоне аргумента, но они не совпадают в каком-либо определенном порядке, поэтому биты в двоичном файле считаются несвязанными. Во втором примере f(X, Bits) -> <<H:Bits, _/binary>> = X
, Биты становятся связанными до соответствия <<...>> = X
начинается.
Первый пример может быть прочитан как "взять число бит, указанное во втором аргументе, и извлечь такое количество битов из двоичного как H" (что вы хотели), но также можно прочитать как "захватить произвольное число битов (возможно, как можно больше) из двоичного файла как H, а затем убедитесь, что он совпадает с числом, переданным во втором аргументе ". Чтобы избежать этой неоднозначности, компилятор отклоняет программу.