考虑以下模块
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的输入字符串),然后添加当前正在考虑的数字的值.这是递归发生的,直到输入字符串的所有数字都被消耗,给定输入字符串表示的整数.
归档时间: |
|
查看次数: |
1061 次 |
最近记录: |