Сопоставление аргументов двоичных битов

У меня проблема с сопоставлением переменного числа битов в двоичном файле, который я сузил до следующего примера игрушки, чтобы извлечь первые несколько битов двоичного файла:

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, а затем убедитесь, что он совпадает с числом, переданным во втором аргументе ". Чтобы избежать этой неоднозначности, компилятор отклоняет программу.

Другие вопросы по тегам