В документации по Elixir, охватывающей понимание, я наткнулся на следующий пример:

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

Теперь я как бы понимаю все выражение, но не могу понять, что означает «? \ S». Я знаю, что это как-то совпадает и таким образом отфильтровывает пробелы, но на этом мое понимание заканчивается.

Редактировать: я теперь понял, что он разрешается до 32, который является символьным кодом пробела, но я до сих пор не знаю, почему.

2
Xerus 21 Фев 2020 в 18:27

2 ответа

Лучший ответ

У есть литералы, обозначенные знаком доллара.

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

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

Точно так же имеют литералы символов, которые в соответствии с документация кода act в точности как erlang символьные литералы:

Это именно то, что 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 "

Кроме того, также использует ?c обозначение для литералов символов:

main> ?\s == ' '
#⇒ true
7
Aleksei Matiushkin 21 Фев 2020 в 16:02

? - это литерал, который дает вам код следующего символа (https://elixir-lang.org/getting-started/binaries-strings-and-char-lists.html#utf-8-and-unicode) , Для символов, которые не могут быть выражены буквально (пробел - только один из них, но их больше: табуляция, возврат каретки, ...) вместо этого следует использовать экранированную последовательность. Итак, ?\s дает вам код для пробела:

iex> ?\s
32
3
Konstantin Strukov 21 Фев 2020 в 15:50