“?”是什么意思?运算符在 Elixir 中做什么?

发布于 2025-01-19 13:44:24 字数 367 浏览 0 评论 0原文

Ecto 源代码使用表达式 ?0?1 等。您可以看到他们如何评估:

iex(14)> ?0
48
iex(15)> ?1
49
iex(16)> ?2
50

但这是什么意思?这是非常难寻找的。 ? 实际上有什么作用?

The Ecto source code makes use of expressions ?0, ?1, etc. You can see how they evaluate:

iex(14)> ?0
48
iex(15)> ?1
49
iex(16)> ?2
50

What does that mean though? This is very hard to search for. What does the ?<character> actually do?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

故事未完 2025-01-26 13:44:24

来自: https: //elixir-lang.org/getting-started/binaries-strings-and-char-lists.html#unicode-and-code-points

在 Elixir 中你可以使用 ?在字符文字前面以显示其代码点:

如果您不熟悉代码点

Unicode 将其所有字符组织成代码表,并且每个字符都有一个唯一的数字索引。该数字索引称为代码点。

? 还可以以有趣的方式用于 模式匹配

  defp parse_unsigned(<<digit, rest::binary>>) when digit in ?0..?9,
    do: parse_unsigned(rest, false, false, <<digit>>)

  ...

  defp parse_unsigned(<<?., digit, rest::binary>>, false, false, acc) when digit in ?0..?9,
    do: parse_unsigned(rest, true, false, <<acc::binary, ?., digit>>)

Elixir 文档< /a> 还澄清这只是语法。正如@sabiwara 指出的:

这些构造仅存在于语法级别。 quote do: ?A 仅返回 65 并且不显示任何 ? 运算符

正如 @Everett 在评论中指出的,有一个有用的包名为 Xray 提供了一些方便的实用函数来帮助理解发生了什么事。

例如 Xray.codepoint(some_char) 可以执行 ? 的操作,但它适用于变量,而 ? 仅适用于文字。 Xray.codepoints(some_string) 将执行以下操作整个字符串。

From: https://elixir-lang.org/getting-started/binaries-strings-and-char-lists.html#unicode-and-code-points

In Elixir you can use a ? in front of a character literal to reveal its code point:

If you aren't familiar with code points:

Unicode organizes all of the characters in its repertoire into code charts, and each character is given a unique numerical index. This numerical index is known as a Code Point.

The ?<character> can also be used in interesting ways for pattern matching and guard clauses.

  defp parse_unsigned(<<digit, rest::binary>>) when digit in ?0..?9,
    do: parse_unsigned(rest, false, false, <<digit>>)

  ...

  defp parse_unsigned(<<?., digit, rest::binary>>, false, false, acc) when digit in ?0..?9,
    do: parse_unsigned(rest, true, false, <<acc::binary, ?., digit>>)

The Elixir docs on it also clarify that it is only syntax. As @sabiwara points out:

Those constructs exist only at the syntax level. quote do: ?A just returns 65 and doesn't show any ? operator

As @Everett noted in the comments, there is a helpful package called Xray that provides some handy utility functions to help understand what's happening.

For example Xray.codepoint(some_char) can do what ?<char> does but it works for variables whereas ? only works with literals. Xray.codepoints(some_string) will do the whole string.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文