【问题标题】:What does question mark mean?问号是什么意思?
【发布时间】:2016-03-17 05:34:45
【问题描述】:

考虑以下模块

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

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

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

作为输出我得到了

123

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

value*10 + digit - ?0

?0 的真正含义是什么?我知道,当我在 shell 上编写 ?x 时,它会显示像

这样的代码点
iex(13)> ?5
53
iex(14)> ?t
116

?0 的代码点为 -48。上面的例子是 123,第一次迭代 1 的计算看起来像(value*10 + digit - ?0):

0 * 10 + 1 - 48 

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

【问题讨论】:

  • 从google搜索,复制粘贴:“函数名中的问号表示返回值将是布尔值”
  • 它不能是布尔值,因为它返回一个数字。
  • @EvanCarslake 那是指函数名称中的问号。他在询问论点列表中的问号。两种不同的东西。

标签: elixir


【解决方案1】:

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

_number_digits 函数的第二个子句中完成的- ?0 从数字的代码点值中减去字符“0”的代码点。这很方便地为您提供整数 0 代表数字“0”,数字 1 代表数字“1”,等等。

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

【讨论】:

  • 当我在 iex 中写入 `[x, y, z] = '123'` 时,我明白了,那个数字使用代码点值来计算结果。模式匹配的威力。非常感谢。
猜你喜欢
  • 2014-07-28
  • 2018-06-23
  • 1970-01-01
  • 2012-04-19
  • 2010-09-29
  • 2011-04-18
  • 1970-01-01
  • 2011-04-14
相关资源
最近更新 更多