gpt4 book ai didi

elixir - 如果我在尝试构建 Elixir 位串时指定现有位串的大小,则会出现参数错误

转载 作者:行者123 更新时间:2023-12-02 01:30:33 26 4
gpt4 key购买 nike

我正在处理 this exercism problem并尝试从位串中提取 7 位,在字节的开头附加一个前导/标记位,并将两者附加到另一个累加器位串的开头。

在此过程中,我偶然发现了一个令人困惑的错误,如果我尝试指定已经是位字符串的内容的大小,则该错误被称为 ArgumentError,毫无帮助。

这是一个例子:

iex(28)> a = <<64::size(7)>>
<<64::size(7)>>
iex(29)> b = <<1::size(1)>>
<<1::size(1)>>
iex(30)> <<b::size(1), a::size(7)>>
** (ArgumentError) argument error while evaluating iex at line 30
(stdlib 4.0) eval_bits.erl:143: :eval_bits.eval_exp_field/6
(stdlib 4.0) eval_bits.erl:77: :eval_bits.create_binary/2
(stdlib 4.0) eval_bits.erl:68: :eval_bits.expr_grp/5
(stdlib 4.0) erl_eval.erl:543: :erl_eval.expr/6
(iex 1.13.4) lib/iex/evaluator.ex:310: IEx.Evaluator.handle_eval/3
iex(30> # of course, this works
iex(30)> <<b::bitstring, a::bitstring>>
<<192>>

为什么我不能指定位串的大小?这似乎对于捕获意外的大小很有用。

为什么错误消息如此无用?

最佳答案

请参阅 Types <<>> 部分文档:

When no type is specified, the default is integer

<<a::size(7)>>相当于 <<a::integer-size(7)>> ,这是不正确的,因为 a是一个位串,而不是一个整数。正确的语法是 <<a::bitstring-size(7)>> (或为简洁起见 <<a::bits-size(7)>>)。

举个例子:

iex> <<b::bits-size(1), a::bits-size(7)>>
<<192>>

另一个例子:

iex> <<prefix::bits-size(4), _::bits>> = <<0b11110000>>
<<240>>
iex> <<_::bits-size(4), suffix::bits-size(4)>> = <<0b00001111>>
<<15>>
iex> <<prefix::bits-size(4), suffix::bits-size(4)>>
<<255>>

但正如 Aleksei 所说,一般来说,使用整数而不是位串更简单:

iex> <<1::1, 64::7>>
<<192>>

why is the error message so unhelpful?

可能是由于 OTP 在生成友好错误消息方面的限制,并且直到最近才有人专注于改进它。正如 sabiwara 在评论中提到的,这是从 OTP 25 改进的和 Elixir 1.14 :

Improved and more detailed error messages when binary construction with the binary syntax fails.

These improvements apply to Elixir as well. Before v1.14, errors when constructing binaries would often be hard-to-debug generic "argument errors"

关于elixir - 如果我在尝试构建 Elixir 位串时指定现有位串的大小,则会出现参数错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73386764/

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