【问题标题】:Why does for x <- 3..4, do: x * 3 return '\t\f' in Elixir? [duplicate]为什么 for x <- 3..4, do: x * 3 在 Elixir 中返回 '\t\f'? [复制]
【发布时间】:2021-03-16 00:25:36
【问题描述】:

在 Elixir 中,为什么理解 for x &lt;- 3..4, do: x * 2 会导致 [6, 8]for x &lt;- 3..4, do: x * 3 会导致 '\t\f'

我正在iex repl 中执行此操作。

【问题讨论】:

标签: elixir


【解决方案1】:

这是 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

【讨论】:

  • 谢谢。非常明确的答案。
猜你喜欢
  • 2021-07-08
  • 2013-08-29
  • 1970-01-01
  • 2017-07-10
  • 2011-12-14
  • 2016-01-13
  • 2013-07-06
  • 1970-01-01
  • 2013-09-01
相关资源
最近更新 更多