xeruf
xeruf

Reputation: 2990

What does "?\s" mean in Elixir?

In the Elixir-documentation covering comprehensions I ran across the following example:

iex> for <<c <- " hello world ">>, c != ?\s, into: "", do: <<c>>
"helloworld"

I sort of understand the whole expression now, but I can't figure out what the "?\s" means. I know that it somehow matches and thus filters out the spaces, but that's where my understanding ends.

Edit: I have now figured out that it resolves to 32, which is the character code of a space, but I still don't know why.

Upvotes: 2

Views: 1017

Answers (2)

Aleksei Matiushkin
Aleksei Matiushkin

Reputation: 121000

has char literals denoted by a dollar sign.

Erlang/OTP 22 [erts-10.6.1] [...]

Eshell V10.6.1  (abort with ^G)
1> $\s == 32.
%%⇒ true

The same way has char literals that according to the code documentation act exactly as erlang char literals:

This is exactly what Erlang does with Erlang char literals ($a).


Basically, ?\s is exactly the same as (question mark followed by a space.)

#               ⇓ space here
iex|1 ▶ ?\s == ? 
warning: found ? followed by code point 0x20 (space), please use ?\s instead

There is nothing special with ?\s, as you might see:

for <<c <- " hello world ">>, c != ?o, into: "", do: <<c>> 
#⇒ " hell wrld "

Also, as well uses ?c notation for char literals:

main> ?\s == ' '
#⇒ true

Upvotes: 7

Konstantin Strukov
Konstantin Strukov

Reputation: 3019

? is a literal that gives you the following character's codepoint( https://elixir-lang.org/getting-started/binaries-strings-and-char-lists.html#utf-8-and-unicode). For characters that cannot be expressed literally (space is just one of them, but there are more: tab, carriage return, ...) the escaped sequence should be used instead. So ?\s gives you a codepoint for space:

iex> ?\s
32

Upvotes: 3

Related Questions