2016-03-16 6 views
2

Рассмотрим следующий модульЧто означает знак вопроса?

defmodule Parse do 

    def number([ ?- | tail ]), do: _number_digits(tail, 0) * -1 
    def number([ ?+ | tail ]), do: _number_digits(tail, 0) 
    def number(str),   do: _number_digits(str, 0) 

    defp _number_digits([], value), do: value 
    defp _number_digits([ digit | tail ], value) when digit in '' do 
    _number_digits(tail, value*10 + digit - ?0) 
    end 
    defp _number_digits([ non_digit | _ ], _) do 
    raise "Invalid digit '#{[non_digit]}'" 
    end 

end 

Когда я импортировать файл в оболочке и выполнить следующее заявление:

iex(3)> Parse.number('123') 

, как выход я получил

123 

То, что я действительно не понимаю, эта линия:

value*10 + digit - ?0 

Что такое? 0 действительно означает? Я знаю, когда я пишу? Х на раковине, он показывает мне точку кода, как

iex(13)> ?5 
53 
iex(14)> ?t 
116 

? 0 имеет кодовую -48. В приведенном выше примере с 123, расчет с первым номер итерации 1 будет выглядит как (значение * 10 + цифра - 0):

0 * 10 + 1 - 48 

Когда я вычислить сам, я хотел бы получить в результате -47, но я У меня 1, почему?

+0

От поиска, копирования и вставки google: знак вопроса в имени функции указывает, что возвращаемое значение будет логическим " –

+1

Это не может быть логическим, потому что оно возвращает число. –

+1

@EvanCarslake Это относится к вопросительному знаку в имени функции. Он спрашивает о вопросительном знаке в списке аргументов. Две разные вещи. –

ответ

12

?, за которым следует символ, дает вам значение кодовой точки Юникода этого символа.

- ?0, выполняемый во втором разделе функции _number_digits, вычитает кодовую точку символа '0' из значения кодовой точки цифры. Это удобно дает целое число 0 для цифры «0», 1 для цифры «1» и т. Д.

Таким образом, выражение всего value*10 + digit - ?0 сначала умножает общее количество (value) на 10 (поскольку мы имеем дело с с входными строками базового 10), затем добавляет значение для текущей рассматриваемой цифры. Это происходит рекурсивно до тех пор, пока не будут использованы все цифры входной строки, если вы получите целое число, представленное входной строкой.

+0

Когда я пишу '[x, y, z] = '123'' в iex, тогда он уточняет, что эта цифра использует значение кодовой точки для вычисления результата. Сила соответствия шаблону. Спасибо. –

Смежные вопросы