Что значит "? \ S" в эликсире? - PullRequest
2 голосов
/ 21 февраля 2020

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

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

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

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

Ответы [ 2 ]

7 голосов
/ 21 февраля 2020

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

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

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

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

Это именно то, что Эрланг делает с символами Erlang ($ 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
3 голосов
/ 21 февраля 2020

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

iex> ?\s
32
...