【发布时间】:2021-03-16 00:25:36
【问题描述】:
在 Elixir 中,为什么理解 for x <- 3..4, do: x * 2 会导致 [6, 8] 而 for x <- 3..4, do: x * 3 会导致 '\t\f' ?
我正在iex repl 中执行此操作。
【问题讨论】:
标签: elixir
在 Elixir 中,为什么理解 for x <- 3..4, do: x * 2 会导致 [6, 8] 而 for x <- 3..4, do: x * 3 会导致 '\t\f' ?
我正在iex repl 中执行此操作。
【问题讨论】:
标签: elixir
这是 Elixir 中最令人困惑的陷阱之一:charlists 的“人性化”。有关与同一问题相关的问题,请参阅 this post。
字符列表是整数代码点的列表,用于表示未编码的字符串(在编码被烘焙之前的旧 Erlang 库中更常见)。因此,如果您有一个整数列表,Elixir(出于历史原因)必须猜测您是否打算表示“字符串”——因此,如果该列表中的所有整数都低于 127,Elixir 假定这必须是一个表示“字符串”数据的字符列表,它会打印出相应的 ASCII 字符以形成可读的字符串。
您可以通过在对IO.inspect/2 的调用中设置charlists: :as_lists 选项来揭示实际的内部表示:
iex(1)> result = for x <- 3..4, do: x * 3
'\t\f'
iex(2)> IO.inspect(result, charlists: :as_lists)
[9, 12]
'\t\f'
或更简单地说:
iex> IO.inspect([9, 12], charlists: :as_lists)
[9, 12]
'\t\f'
这向我们显示了预期的整数 (9, 12),如果我们费心在 Unicode 或 ASCII 代码图表中查找这些,我们会看到 \t 和 \f 字符由代码点 9 和分别为 12 个。
请记住,这些数据表示只是可视化的——基础数据是 100% 相同的:
iex> [9, 12] === '\t\f'
true
【讨论】: