问号是什么意思?

zer*_*ing 2 elixir

考虑以下模块

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 '0123456789' do
    _number_digits(tail, value*10 + digit - ?0)
  end
  defp _number_digits([ non_digit | _ ], _) do
    raise "Invalid digit '#{[non_digit]}'"
  end

end
Run Code Online (Sandbox Code Playgroud)

当我将文件导入shell并执行以下语句时:

iex(3)> Parse.number('123')
Run Code Online (Sandbox Code Playgroud)

作为输出我有

123
Run Code Online (Sandbox Code Playgroud)

我真正不明白的是这一行:

value*10 + digit - ?0
Run Code Online (Sandbox Code Playgroud)

什么?0真的是什么意思?我知道,当我在shell上编写?x时,它会向我显示代码点

iex(13)> ?5
53
iex(14)> ?t
116
Run Code Online (Sandbox Code Playgroud)

?0具有代码点-48.上面的示例使用123,第一次迭代编号1的计算看起来像(值*10 +数字 - ?0):

0 * 10 + 1 - 48 
Run Code Online (Sandbox Code Playgroud)

当我自己计算时,我会得到结果-47但我有1,为什么?

tom*_*tom 12

? 后跟一个字符,为您提供该字符的Unicode代码点值.

函数- ?0的第二个子句中的done _number_digits从数字的代码点值中减去字符"0"的代码点.这方便地为数字'0'提供整数0,为数字'1'提供1,等等.

因此,整个value*10 + digit - ?0表达式首先将运行的total(value)乘以10(因为我们正在处理基数为10的输入字符串),然后添加当前正在考虑的数字的值.这是递归发生的,直到输入字符串的所有数字都被消耗,给定输入字符串表示的整数.