Elixir 上的二进制理解
Binary comprehension on Elixir
是否可能,如果可能,我如何在 Elixir 上使用二进制理解?我可以在 Erlang 上这样做:
[One || <<One, _rest:3/binary>> <= <<1,2,3,4>>].
我在文档中找到了解决方案:
for << one, _rest :: binary - size(3) <- <<1,2,3,4>> >>, do: one
Erlang 中的内容是:
1> [Red || <<Red:2/binary, _Blue:2/binary>> <= <<1, 2, 3, 4, 5, 6, 7, 8>> ].
[<<1,2>>,<<5,6>>]
在 Elixir 中是:
iex(1)> for <<red::8, green::8, blue::16 <- <<1, 2, 3, 4, 5, 6, 7, 8>> >>, do: <<red, green>>
[<<1, 2>>, <<5, 6>>]
请注意,上面的 Elixir 明确声明了以位为单位的大小,而 Erlang 正在使用一种类型来使计算以字节为单位截断大小。在 Elixir 中可能有一种更简洁的方法来做到这一点(至少我 希望 有)而且我什至可能四处寻找它——但大多数时候我想这样做我坚持使用 Erlang 只是为了 readability/universality.
附录
@aronisstav 问了一个有趣的问题:"Shouldn't there be a part matching the green
pattern in the Erlang code?"
答案是 会 是 Erlang 中的一个 Green
变量,如果该代码处理位串而不是二进制文件。 Erlang's bit syntax provides ways to indicate a few arbitrary binary types which correspond to default sizes。上面我匹配了 Red:2/binary
这意味着我想匹配一个 2 个字节的序列,这就是我们如何得到结果 [<<1,2>><<5,6>>]
:两个两个字节的序列。
完全等同于上面的 Elixir 代码的 Erlang 示例是:
[<<Red/bitstring, Green/bitstring>>
|| <<Red:8/bitstring, Green:8/bitstring, _Blue:2/binary>>
<= <<1, 2, 3, 4, 5, 6, 7, 8>> ].
但这很愚蠢,因为 Erlang 的字节语法要简洁得多。
是否可能,如果可能,我如何在 Elixir 上使用二进制理解?我可以在 Erlang 上这样做:
[One || <<One, _rest:3/binary>> <= <<1,2,3,4>>].
我在文档中找到了解决方案:
for << one, _rest :: binary - size(3) <- <<1,2,3,4>> >>, do: one
Erlang 中的内容是:
1> [Red || <<Red:2/binary, _Blue:2/binary>> <= <<1, 2, 3, 4, 5, 6, 7, 8>> ].
[<<1,2>>,<<5,6>>]
在 Elixir 中是:
iex(1)> for <<red::8, green::8, blue::16 <- <<1, 2, 3, 4, 5, 6, 7, 8>> >>, do: <<red, green>>
[<<1, 2>>, <<5, 6>>]
请注意,上面的 Elixir 明确声明了以位为单位的大小,而 Erlang 正在使用一种类型来使计算以字节为单位截断大小。在 Elixir 中可能有一种更简洁的方法来做到这一点(至少我 希望 有)而且我什至可能四处寻找它——但大多数时候我想这样做我坚持使用 Erlang 只是为了 readability/universality.
附录
@aronisstav 问了一个有趣的问题:"Shouldn't there be a part matching the green
pattern in the Erlang code?"
答案是 会 是 Erlang 中的一个 Green
变量,如果该代码处理位串而不是二进制文件。 Erlang's bit syntax provides ways to indicate a few arbitrary binary types which correspond to default sizes。上面我匹配了 Red:2/binary
这意味着我想匹配一个 2 个字节的序列,这就是我们如何得到结果 [<<1,2>><<5,6>>]
:两个两个字节的序列。
完全等同于上面的 Elixir 代码的 Erlang 示例是:
[<<Red/bitstring, Green/bitstring>>
|| <<Red:8/bitstring, Green:8/bitstring, _Blue:2/binary>>
<= <<1, 2, 3, 4, 5, 6, 7, 8>> ].
但这很愚蠢,因为 Erlang 的字节语法要简洁得多。