在涵盖comprehensions的Elixir文档中,我遇到了以下示例:
iex> for <<c <- " hello world ">>, c != ?\s, into: "", do: <<c>>
"helloworld"
我现在有点理解整个表达式,但是我不知道“?\ s”是什么意思。 我知道它以某种方式匹配并因此过滤掉了空格,但这就是我的理解要结束的地方。
编辑:我现在发现它可以解析为32,这是空格的字符代码,但是我仍然不知道为什么。
答案 0 :(得分:7)
erlang具有用美元符号表示的字符文字。
Erlang/OTP 22 [erts-10.6.1] [...]
Eshell V10.6.1 (abort with ^G)
1> $\s == 32.
%%⇒ true
elixir具有char文字的方式与根据code documentation的字符文字完全一样,是 erlang char文字:
这正是Erlang使用Erlang char文字($ a)的作用。
基本上,?\s
与?
完全相同(问号后跟一个空格。)
# ⇓ space here
iex|1 ▶ ?\s == ?
warning: found ? followed by code point 0x20 (space), please use ?\s instead
?\s
没什么特别的,您可能会看到:
for <<c <- " hello world ">>, c != ?o, into: "", do: <<c>>
#⇒ " hell wrld "
另外,ruby还将?c
表示为字符常量:
main> ?\s == ' '
#⇒ true
答案 1 :(得分:3)
?
是一个文字,为您提供以下字符的代码点(https://elixir-lang.org/getting-started/binaries-strings-and-char-lists.html#utf-8-and-unicode)。对于无法从字面上表示的字符(空格只是其中之一,但还有更多:制表符,回车符等),应改用转义的序列。因此?\s
为您提供了空间的代码点:
iex> ?\s
32