【问题标题】:Odd behavior when mapping with Integer.parse in Elixir [duplicate]在 Elixir 中使用 Integer.parse 映射时的奇怪行为 [重复]
【发布时间】:2018-01-25 05:51:51
【问题描述】:

在 Elixir 中的字符串映射上映射 Integer.parse 时,我遇到了一些非常奇怪的行为。我执行了以下操作: Enum.map(["7", "8", "9"], &elem(Integer.parse(&1), 0)) 这导致以下输出:'\a\b\t'

奇怪的是,如果我更改“7”,它的行为就像我预期的那样:

`Enum.map(["4", "8", "9"], &elem(Integer.parse(&1), 0))`

[4, 8, 9] 中的结果

进一步的实验表明,大于 6 但小于 14 的每个前导数都有类似的行为

例如,Enum.map(["11", "8", "10"], &elem(Integer.parse(&1), 0)) 的结果是 '\v\b\n',但 Enum.map(["16", "8", "10"], &elem(Integer.parse(&1), 0)) 的结果是 [16, 8, 10]

对此有何解释?

【问题讨论】:

    标签: elixir


    【解决方案1】:

    问题在于 Erlang 将所有元素映射到可打印 ascii 字符的整数列表视为字符列表。因此,如果整数列表仅包含可以映射到 ascii 字符的数字,那么它将被打印为字符序列。 [7, 8, 9] == '\a\b\t' 返回 true 因为 Erlang 不区分整数列表和字符列表版本。每当整数列表不只生成可打印的 ASCII 时,就会看到像 [16, 8, 9] 那样打印整数列表的行为。

    执行i [7, 8, 9] 会导致对此行为的解释。

    【讨论】:

      【解决方案2】:

      基本上这是所有“可打印”的行为默认打印为 charlist(带单引号的字符串)。

      有些人通常在列表末尾添加0 以摆脱它,但现在有更好的解决方案:

      inspect [7, 8, 9], charlists: :as_lists
      # "[7, 8, 9]"
      inspect [7, 8, 9], charlists: :as_charlists
      "'\\a\\b\\t'"
      

      您可以阅读有关使用inspect/2 使用h Inspect.Opts 自定义显示的更多信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-19
        • 1970-01-01
        • 2015-03-25
        • 2019-03-04
        • 2021-06-24
        • 2010-11-26
        • 1970-01-01
        相关资源
        最近更新 更多